├── MySQL 5.7 高可用新玩法.pdf ├── README.md ├── keepalived ├── checkMySQL.py ├── config.py ├── keepalived.conf └── notify.py ├── mysql ├── change.txt ├── node1.my3309.cnf ├── node2.my3309.cnf └── node3.my3309.cnf └── zst └── zst-wxcode.jpg /MySQL 5.7 高可用新玩法.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhishutech/mysqlha-keepalived-3node/ee58cee383fd679ce1f19bd8451f148cd594d457/MySQL 5.7 高可用新玩法.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 基于MySQL 5.7多源复制+Keepalived搭建高可用 2 | 3 | ##说明 4 | 本内容来源于[知数堂](http://zhishuedu.com) 公开课 : 《MySQL 5.7 高可用新玩法》--吴炳锡 5 | 相关视频推荐:https://ke.qq.com/course/172600 6 | 7 | 8 | ##基本环境准备 9 | 使用Centos 6.X 64位系统 10 | MySQL 使用 MySQL-5.7.17-x86_64 版本,去官方下载mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz 版本 11 | 12 | 13 | 14 | | 机器名 | 操作系统 | IP | 15 | | --- | --- | --- | 16 | | node1 | centos-6.8 | 192.168.11.100 | 17 | | node2 | centos-6.8 | 192.168.11.101 | 18 | | node3 | centos-6.8 | 192.168.11.102 | 19 | 20 | 对应的VIP: 192.168.11.110 21 | 22 | **特别提示:** 23 | 关闭iptables 24 | chkconfig --del iptables 25 | /etc/init.d/iptables stop 26 | 27 | 关闭:selinux 28 | setenforce 0 29 | vim /etc/sysconfig/selinux 30 | SELINUX=permissive 更改为: SELINUX=disabled 31 | 32 | ###下载MySQL : 33 | 34 | ``` 35 | mkdir /data/Soft 36 | cd /data/Soft 37 | wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz 38 | ``` 39 | 40 | ###MySQL部署约定 41 | 二进制文件放置: /opt/mysql/ 下面对应的目录 42 | 数据文件全部放置到 /data/mysql/ 下面对应的目录 43 | 原始二进制文件下载到/data/Soft/ 44 | 45 | ##MySQL基本安装 46 | 以下安装步骤需要在node1, node2, node3上分别执行。 47 | 48 | 49 | 1. mkdir /opt/mysql 50 | 2. cd /opt/mysql 51 | 3. tar zxvf /data/Soft/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz 52 | 4. ln -s /opt/mysql/mysql-5.7.17-linux-glibc2.5-x86_64 /usr/local/mysql 53 | 5. mkdir /data/mysql/mysql3309/{data,logs,tmp} -p 54 | 6. groupadd mysql 55 | 7. useradd -g mysql -s /sbin/nologin -d /usr/local/mysql -M mysql 56 | 8. chown -R mysql:mysql /data/mysql/ 57 | 9. chown -R mysql:mysql /usr/local/mysql 58 | 10. cd /usr/local/mysql/ 59 | 11. ./bin/mysqld --defaults-file=/data/mysql/mysql3309/my3309.cnf --initialize 60 | 12. cat /data/mysql/mysql3309/data/error.log |grep password 61 | 13. /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3309/my3309.cnf & 62 | 14. echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile 63 | 15. source /etc/profile 64 | 16. mysql -S /tmp/mysql3309.sock -p #输才查到密码进入MySQL 65 | 17. mysql>alter user user() identified by 'wubxwubx' 66 | 18. mysql>grant replication slave on *.* to 'repl'@'%' identified by 'repl4slave'; 67 | 19. mysql>grant all privilegs on *.* to 'wubx'@'%' identified by 'wubxwubx' # 一会测试使用的帐号 68 | 20. mysql>reset master 69 | 70 | 71 | 每个节点按上面进行,遇到初始化和启动故障请认真阅读/data/mysql/mysql3309/data/error.log 信息。 my3309.cnf 可以从相应的目录下载或是加入QQ群: 579036588 下载,有问题入裙讨论。 72 | 73 | ##搭建主从结构 74 | 75 | **node1上执行: ** 76 | 77 | 78 | mysql -S /tmp/mysql3309.sock -pwubxwubx 79 | 80 | mysql>change master to master_host='192.168.11.101', master_port=3309, master_user='repl', master_password='repl4slave',master_auto_position=1 for channel '192_168_11_101_3309'; 81 | 82 | mysql>change master to master_host='192.168.11.102', master_port=3309, master_user='repl', master_password='repl4slave',master_auto_position=1 for channel '192_168_11_102_3309'; 83 | 84 | mysql>start slave; 85 | mysql>show slave status\G; #确认同步OK 86 | 87 | 88 | **node2上执行:** 89 | 90 | mysql -S /tmp/mysql3309.sock -pwubxwubx 91 | 92 | mysql>change master to master_host='192.168.11.100', master_port=3309, master_user='repl', master_password='repl4slave',master_auto_position=1 for channel '192_168_11_100_3309'; 93 | 94 | mysql>change master to master_host='192.168.11.102', master_port=3309, master_user='repl', master_password='repl4slave',master_auto_position=1 for channel '192_168_11_102_3309'; 95 | 96 | mysql>start slave; 97 | mysql>show slave status\G; #确认同步OK 98 | 99 | 100 | 101 | **node3上执行:** 102 | 103 | mysql -S /tmp/mysql3309.sock -pwubxwubx 104 | 105 | mysql>change master to master_host='192.168.11.100', master_port=3309, master_user='repl', master_password='repl4slave',master_auto_position=1 for channel '192_168_11_100_3309'; 106 | 107 | mysql>change master to master_host='192.168.11.101', master_port=3309, master_user='repl', master_password='repl4slave',master_auto_position=1 for channel '192_168_11_101_3309'; 108 | 109 | mysql>start slave; 110 | 111 | mysql>show slave status\G; #确认同步OK 112 | 113 | 114 | ##安装keepalived 115 | node1, node2, node3 上分别执行: 116 | **安装keepalived** 117 | ``` 118 | yum install keepalivled 119 | ``` 120 | **安装python依赖模块:** 121 | 122 | ``` 123 | yum install MySQL-python.x86_64 124 | yum install python2-filelock.noarch 125 | ``` 126 | 127 | ##keepalived配置 128 | 配置文件放置在: /etc/keepalived/keepalived.conf 129 | 内容如下: 130 | 131 | ``` 132 | vrrp_script vs_mysql_82 { 133 | script "/etc/keepalived/checkMySQL.py -h 127.0.0.1 -P 3309" 134 | interval 15 135 | } 136 | vrrp_instance VI_82 { 137 | state backup 138 | nopreempt 139 | interface eth1 140 | virtual_router_id 82 141 | priority 100 142 | advert_int 5 143 | authentication { 144 | auth_type PASS 145 | auth_pass 1111 146 | } 147 | track_script { 148 | vs_mysql_82 149 | } 150 | notify /etc/keepalived/notify.py 151 | virtual_ipaddress { 152 | 192.168.11.110 153 | } 154 | } 155 | ``` 156 | 157 | ##Keepalived启动 158 | node1, node2, node3分别执行: 159 | ``` 160 | /etc/init.d/keepalived start 161 | 162 | ``` 163 | 观查每个系统上的/var/log/messages 内容输出 164 | 165 | ##测试用例 166 | 在其它机器上使用: 167 | 168 | ``` 169 | mysql -h 192.168.11.110 -P 3309 -uwubx -pwubxwubx -e "select @@hostname" 170 | ``` 171 | 172 | 自已触发一下切换看看能不能完成自动化的切换。 173 | ## 关注知数堂公从号 第一时间参加技术交流 174 | ![知数堂公众号](https://github.com/zhishutech/mysqlha-keepalived-3node/blob/master/zst/zst-wxcode.jpg?raw=true) 175 | 176 | -------------------------------------------------------------------------------- /keepalived/checkMySQL.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | #coding: utf-8 3 | #http://zhishuedu.com 4 | #Copyriht(c) 2017 - wubx(wubx@zhishuedu.com) 5 | 6 | import sys 7 | import os 8 | import getopt 9 | import MySQLdb 10 | import logging 11 | import filelock 12 | import config 13 | 14 | 15 | dbhost=config.dbhost 16 | dbport=config.dbport 17 | dbuser=config.dbuser 18 | dbpassword=config.dbpassword 19 | 20 | 21 | logging.basicConfig(level=logging.DEBUG, 22 | format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', 23 | datefmt='%a, %d %b %Y %H:%M:%S', 24 | filename='/tmp/kp_check.log', 25 | filemode='a') 26 | 27 | 28 | def checkMySQL(): 29 | global dbhost 30 | global dbport 31 | global dbuser 32 | global dbpassword 33 | 34 | shortargs='h:P:' 35 | opts, args=getopt.getopt(sys.argv[1:],shortargs) 36 | for opt, value in opts: 37 | if opt=='-h': 38 | dbhost=value 39 | elif opt=='-P': 40 | dbport=value 41 | #print "host : %s, port: %d, user: %s, password: %s" % (dbhost, int(dbport), dbuser, dbpassword) 42 | db = instanceMySQL(dbhost, dbport, dbuser, dbpassword) 43 | st = db.ishaveMySQL() 44 | #if ( db.connect() != 0 ): 45 | # return 1 46 | #db.disconnect() 47 | return st 48 | 49 | class instanceMySQL: 50 | conn = None 51 | def __init__(self, host=None,port=None, user=None, passwd=None): 52 | self.dbhost= host 53 | self.dbport = int(port) 54 | self.dbuser = user 55 | self.dbpassword = passwd 56 | 57 | def ishaveMySQL(self): 58 | cmd="ps -ef | egrep -i \"mysqld\" | grep %s | egrep -iv \"mysqld_safe\" | grep -v grep | wc -l" % self.dbport 59 | mysqldNum = os.popen(cmd).read() 60 | cmd ="netstat -tunlp | grep \":%s\" | wc -l" % self.dbport 61 | mysqlPortNum= os.popen(cmd).read() 62 | #print mysqldNum, mysqlPortNum 63 | if ( int(mysqldNum) <= 0): 64 | print "error" 65 | return 1 66 | if ( int(mysqldNum) > 0 and mysqlPortNum <= 0): 67 | return 1 68 | return 0 69 | 70 | def connect(self): 71 | # print "in db conn" 72 | # print "host : %s, port: %d, user: %s, password: %s" % (self.dbhost, self.dbport, self.dbuser, self.dbpassword) 73 | try: 74 | self.conn=MySQLdb.connect(host="%s"%self.dbhost, port=self.dbport,user="%s"%dbuser, passwd="%s"%self.dbpassword) 75 | except Exception, e: 76 | # print " Error" 77 | print e 78 | return 1 79 | return 0 80 | def disconnect(self): 81 | if (self.conn): 82 | self.conn.close() 83 | self.conn = None 84 | 85 | 86 | if __name__== "__main__": 87 | lock = filelock.FileLock("/tmp/kpc.txt") 88 | if lock: 89 | logging.info("ZST Get Lock.start!!!") 90 | try: 91 | with lock.acquire(timeout=5): 92 | pass 93 | except filelock.timeout: 94 | print "timeout" 95 | logging.warning("get file lock timeout") 96 | 97 | st=checkMySQL() 98 | sys.exit(st) 99 | -------------------------------------------------------------------------------- /keepalived/config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | #http://zhishuedu.com 3 | #Copyriht(c) 2017 - wubx(wubx@zhishuedu.com) 4 | 5 | dbhost='192.168.11.100' 6 | dbport=3309 7 | dbuser='wubx' 8 | dbpassword='wubxwubx' 9 | -------------------------------------------------------------------------------- /keepalived/keepalived.conf: -------------------------------------------------------------------------------- 1 | vrrp_script vs_mysql_82 { 2 | script "/etc/keepalived/checkMySQL.py -h 127.0.0.1 -P 3309" 3 | interval 15 4 | } 5 | vrrp_instance VI_82 { 6 | state backup 7 | nopreempt 8 | interface eth1 9 | virtual_router_id 82 10 | priority 100 11 | advert_int 5 12 | authentication { 13 | auth_type PASS 14 | auth_pass 1111 15 | } 16 | track_script { 17 | vs_mysql_82 18 | } 19 | notify /etc/keepalived/notify.py 20 | virtual_ipaddress { 21 | 192.168.11.110 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /keepalived/notify.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | #coding: utf-8 3 | #http://zhishuedu.com 4 | #Copyriht(c) 2017 - wubx(wubx@zhishuedu.com) 5 | 6 | import sys 7 | import os 8 | import getopt 9 | import MySQLdb 10 | import logging 11 | import filelock 12 | import config 13 | 14 | preSlaveSQL="set global super_read_only=1; set global read_only=1;" 15 | preMasterSQL="set global super_read_only=0; set global read_only=0;" 16 | 17 | logging.basicConfig(level=logging.DEBUG, 18 | format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', 19 | datefmt='%a, %d %b %Y %H:%M:%S', 20 | filename='/tmp/kp.log', 21 | filemode='a') 22 | 23 | class DBase: 24 | conn = None 25 | def __init__(self, host=None,port=None, user=None, passwd=None): 26 | self.dbhost= host 27 | self.dbport = port 28 | self.dbuser = user 29 | self.dbpassword = passwd 30 | self.conn=MySQLdb.connect(host="%s"%self.dbhost, port=3309,user="%s"%dbuser, passwd="%s"%self.dbpassword) 31 | #self.cur = self.conn.cursor() 32 | 33 | 34 | def makeMaster(self): 35 | cursor = self.conn.cursor(MySQLdb.cursors.DictCursor) 36 | 37 | if preMasterSQL.strip() != '' : 38 | cursor.execute(preMasterSQL) 39 | for r in cursor.fetchall(): 40 | print r 41 | cursor.close() 42 | self.conn.commit() 43 | cursor = self.conn.cursor(MySQLdb.cursors.DictCursor) 44 | 45 | query="show slave status" 46 | 47 | cursor.execute(query) 48 | for row in cursor.fetchall(): 49 | 50 | if row['Slave_IO_Running'] == 'Yes': 51 | #print "stop slave io_thread for channel '%s'" %row['Channel_Name'] 52 | cursor.execute("stop slave io_thread for channel '%s'" % row['Channel_Name']) 53 | logging.warning("stop slave io_thread for channel '%s'" % row['Channel_Name']) 54 | 55 | cursor.close() 56 | 57 | def makeSlave(self): 58 | cursor = self.conn.cursor() 59 | 60 | if preSlaveSQL.strip() !='' : 61 | cursor.execute(preSlaveSQL) 62 | for r in cursor.fetchall(): 63 | print r 64 | cursor.close() 65 | self.conn.commit() 66 | cursor = self.conn.cursor(MySQLdb.cursors.DictCursor) 67 | query="show slave status" 68 | 69 | cursor.execute(query) 70 | for row in cursor.fetchall(): 71 | #print row 72 | if row['Slave_IO_Running'] == 'No': 73 | cursor.execute("start slave for channel '%s'" % row['Channel_Name']) 74 | logging.warning("start slave for channel '%s'" % row['Channel_Name']) 75 | 76 | cursor.close() 77 | 78 | 79 | def disconnect(self): 80 | if (self.conn): 81 | self.conn.close() 82 | self.conn = None 83 | 84 | 85 | if __name__== "__main__": 86 | #st=checkMySQL() 87 | #sys.exit(st) 88 | lock = filelock.FileLock("/tmp/kps.txt") 89 | if lock: 90 | logging.info("ZST Get Lock.start!!!") 91 | try: 92 | with lock.acquire(timeout=5): 93 | pass 94 | except filelock.timeout: 95 | print "timeout" 96 | logging.warning("get file lock timeout") 97 | 98 | 99 | #logging.info("abcd") 100 | logging.info(sys.argv) 101 | dbhost = config.dbhost 102 | dbport = config.dbport 103 | dbuser = config.dbuser 104 | dbpassword = config.dbpassword 105 | db = DBase(dbhost,dbport,dbuser,dbpassword) 106 | if sys.argv[3].upper() == 'MASTER': 107 | logging.warning("Current become Master!!!") 108 | db.makeMaster() 109 | if sys.argv[3].upper() == "BACKUP": 110 | logging.warning("Current become Slave!!!") 111 | db.makeSlave() 112 | 113 | db.disconnect() 114 | -------------------------------------------------------------------------------- /mysql/change.txt: -------------------------------------------------------------------------------- 1 | change master to master_host='192.168.11.100', master_port=3309, master_user='repl', master_password='repl4slave',master_auto_position=1 for channel '192_168_11_100_3309'; 2 | change master to master_host='192.168.11.101', master_port=3309, master_user='repl', master_password='repl4slave',master_auto_position=1 for channel '192_168_11_101_3309'; 3 | change master to master_host='192.168.11.102', master_port=3309, master_user='repl', master_password='repl4slave',master_auto_position=1 for channel '192_168_11_102_3309'; 4 | -------------------------------------------------------------------------------- /mysql/node1.my3309.cnf: -------------------------------------------------------------------------------- 1 | #my.cnf 2 | [client] 3 | port = 3309 4 | socket = /tmp/mysql3309.sock 5 | 6 | [mysql] 7 | prompt="\\u@\\h [\\d]>" 8 | #pager="less -i -n -S" 9 | #tee=/opt/mysql/query.log 10 | no-auto-rehash 11 | 12 | [mysqld] 13 | #misc 14 | user = mysql 15 | basedir = /usr/local/mysql 16 | datadir = /data/mysql/mysql3309/data 17 | port = 3309 18 | socket = /tmp/mysql3309.sock 19 | event_scheduler = 0 20 | 21 | tmpdir = /data/mysql/mysql3309/tmp 22 | #timeout 23 | interactive_timeout = 300 24 | wait_timeout = 300 25 | 26 | #character set 27 | character-set-server = utf8 28 | 29 | open_files_limit = 65535 30 | max_connections = 100 31 | max_connect_errors = 100000 32 | lower_case_table_names =1 33 | 34 | #symi replication 35 | 36 | #rpl_semi_sync_master_enabled=1 37 | #rpl_semi_sync_master_timeout=1000 # 1 second 38 | #rpl_semi_sync_slave_enabled=1 39 | 40 | #logs 41 | log-output=file 42 | slow_query_log = 1 43 | slow_query_log_file = slow.log 44 | log-error = error.log 45 | log_warnings = 2 46 | pid-file = mysql.pid 47 | long_query_time = 1 48 | #log-slow-admin-statements = 1 49 | #log-queries-not-using-indexes = 1 50 | log-slow-slave-statements = 1 51 | 52 | #binlog 53 | #binlog_format = STATEMENT 54 | binlog_format = row 55 | server-id = 1003309 56 | log-bin = /data/mysql/mysql3309/logs/mysql-bin 57 | binlog_cache_size = 4M 58 | sync_binlog = 0 59 | expire_logs_days = 10 60 | #procedure 61 | log_bin_trust_function_creators=1 62 | 63 | # 64 | gtid-mode = on 65 | enforce-gtid-consistency=1 66 | 67 | 68 | #relay log 69 | skip_slave_start = 1 70 | max_relay_log_size = 128M 71 | relay_log_purge = 1 72 | relay_log_recovery = 1 73 | relay-log=relay-bin 74 | relay-log-index=relay-bin.index 75 | log_slave_updates 76 | #slave-skip-errors=1032,1053,1062 77 | #skip-grant-tables 78 | 79 | master_info_repository=table 80 | relay_log_info_repository=table 81 | #buffers & cache 82 | table_open_cache = 2048 83 | table_definition_cache = 2048 84 | table_open_cache = 2048 85 | max_heap_table_size = 96M 86 | sort_buffer_size = 128K 87 | join_buffer_size = 128K 88 | thread_cache_size = 200 89 | query_cache_size = 0 90 | query_cache_type = 0 91 | query_cache_limit = 256K 92 | query_cache_min_res_unit = 512 93 | thread_stack = 192K 94 | tmp_table_size = 96M 95 | key_buffer_size = 8M 96 | read_buffer_size = 2M 97 | read_rnd_buffer_size = 16M 98 | bulk_insert_buffer_size = 32M 99 | 100 | #myisam 101 | myisam_sort_buffer_size = 128M 102 | myisam_max_sort_file_size = 10G 103 | myisam_repair_threads = 1 104 | 105 | #innodb 106 | innodb_buffer_pool_size = 100M 107 | innodb_buffer_pool_instances = 1 108 | innodb_data_file_path = ibdata1:100M:autoextend 109 | innodb_flush_log_at_trx_commit = 2 110 | innodb_log_buffer_size = 8M 111 | innodb_log_file_size = 200M 112 | innodb_log_files_in_group = 3 113 | innodb_max_dirty_pages_pct = 50 114 | innodb_file_per_table = 1 115 | innodb_rollback_on_timeout 116 | innodb_status_file = 1 117 | innodb_io_capacity = 100 118 | transaction_isolation = READ-COMMITTED 119 | innodb_flush_method = O_DIRECT 120 | 121 | [mysqld_safe] 122 | malloc-lib=/usr/local/mysql/lib/libjemalloc.so 123 | 124 | -------------------------------------------------------------------------------- /mysql/node2.my3309.cnf: -------------------------------------------------------------------------------- 1 | #my.cnf 2 | [client] 3 | port = 3309 4 | socket = /tmp/mysql3309.sock 5 | 6 | [mysql] 7 | prompt="\\u@\\h [\\d]>" 8 | #pager="less -i -n -S" 9 | #tee=/opt/mysql/query.log 10 | no-auto-rehash 11 | 12 | [mysqld] 13 | #misc 14 | user = mysql 15 | basedir = /usr/local/mysql 16 | datadir = /data/mysql/mysql3309/data 17 | port = 3309 18 | socket = /tmp/mysql3309.sock 19 | event_scheduler = 0 20 | 21 | tmpdir = /data/mysql/mysql3309/tmp 22 | #timeout 23 | interactive_timeout = 300 24 | wait_timeout = 300 25 | 26 | #character set 27 | character-set-server = utf8 28 | 29 | open_files_limit = 65535 30 | max_connections = 100 31 | max_connect_errors = 100000 32 | lower_case_table_names =1 33 | 34 | #symi replication 35 | 36 | #rpl_semi_sync_master_enabled=1 37 | #rpl_semi_sync_master_timeout=1000 # 1 second 38 | #rpl_semi_sync_slave_enabled=1 39 | 40 | #logs 41 | log-output=file 42 | slow_query_log = 1 43 | slow_query_log_file = slow.log 44 | log-error = error.log 45 | log_warnings = 2 46 | pid-file = mysql.pid 47 | long_query_time = 1 48 | #log-slow-admin-statements = 1 49 | #log-queries-not-using-indexes = 1 50 | log-slow-slave-statements = 1 51 | 52 | #binlog 53 | #binlog_format = STATEMENT 54 | binlog_format = row 55 | server-id = 1013309 56 | log-bin = /data/mysql/mysql3309/logs/mysql-bin 57 | binlog_cache_size = 4M 58 | sync_binlog = 0 59 | expire_logs_days = 10 60 | #procedure 61 | log_bin_trust_function_creators=1 62 | 63 | # 64 | gtid-mode = on 65 | enforce-gtid-consistency=1 66 | 67 | 68 | #relay log 69 | skip_slave_start = 1 70 | max_relay_log_size = 128M 71 | relay_log_purge = 1 72 | relay_log_recovery = 1 73 | relay-log=relay-bin 74 | relay-log-index=relay-bin.index 75 | log_slave_updates 76 | #slave-skip-errors=1032,1053,1062 77 | #skip-grant-tables 78 | 79 | master_info_repository=table 80 | relay_log_info_repository=table 81 | #buffers & cache 82 | table_open_cache = 2048 83 | table_definition_cache = 2048 84 | table_open_cache = 2048 85 | max_heap_table_size = 96M 86 | sort_buffer_size = 128K 87 | join_buffer_size = 128K 88 | thread_cache_size = 200 89 | query_cache_size = 0 90 | query_cache_type = 0 91 | query_cache_limit = 256K 92 | query_cache_min_res_unit = 512 93 | thread_stack = 192K 94 | tmp_table_size = 96M 95 | key_buffer_size = 8M 96 | read_buffer_size = 2M 97 | read_rnd_buffer_size = 16M 98 | bulk_insert_buffer_size = 32M 99 | 100 | #myisam 101 | myisam_sort_buffer_size = 128M 102 | myisam_max_sort_file_size = 10G 103 | myisam_repair_threads = 1 104 | 105 | #innodb 106 | innodb_buffer_pool_size = 100M 107 | innodb_buffer_pool_instances = 1 108 | innodb_data_file_path = ibdata1:100M:autoextend 109 | innodb_flush_log_at_trx_commit = 2 110 | innodb_log_buffer_size = 8M 111 | innodb_log_file_size = 200M 112 | innodb_log_files_in_group = 3 113 | innodb_max_dirty_pages_pct = 50 114 | innodb_file_per_table = 1 115 | innodb_rollback_on_timeout 116 | innodb_status_file = 1 117 | innodb_io_capacity = 100 118 | transaction_isolation = READ-COMMITTED 119 | innodb_flush_method = O_DIRECT 120 | 121 | [mysqld_safe] 122 | malloc-lib=/usr/local/mysql/lib/libjemalloc.so 123 | 124 | -------------------------------------------------------------------------------- /mysql/node3.my3309.cnf: -------------------------------------------------------------------------------- 1 | #my.cnf 2 | [client] 3 | port = 3309 4 | socket = /tmp/mysql3309.sock 5 | 6 | [mysql] 7 | prompt="\\u@\\h [\\d]>" 8 | #pager="less -i -n -S" 9 | #tee=/opt/mysql/query.log 10 | no-auto-rehash 11 | 12 | [mysqld] 13 | #misc 14 | user = mysql 15 | basedir = /usr/local/mysql 16 | datadir = /data/mysql/mysql3309/data 17 | port = 3309 18 | socket = /tmp/mysql3309.sock 19 | event_scheduler = 0 20 | 21 | tmpdir = /data/mysql/mysql3309/tmp 22 | #timeout 23 | interactive_timeout = 300 24 | wait_timeout = 300 25 | 26 | #character set 27 | character-set-server = utf8 28 | 29 | open_files_limit = 65535 30 | max_connections = 100 31 | max_connect_errors = 100000 32 | lower_case_table_names =1 33 | 34 | #symi replication 35 | 36 | #rpl_semi_sync_master_enabled=1 37 | #rpl_semi_sync_master_timeout=1000 # 1 second 38 | #rpl_semi_sync_slave_enabled=1 39 | 40 | #logs 41 | log-output=file 42 | slow_query_log = 1 43 | slow_query_log_file = slow.log 44 | log-error = error.log 45 | log_warnings = 2 46 | pid-file = mysql.pid 47 | long_query_time = 1 48 | #log-slow-admin-statements = 1 49 | #log-queries-not-using-indexes = 1 50 | log-slow-slave-statements = 1 51 | 52 | #binlog 53 | #binlog_format = STATEMENT 54 | binlog_format = row 55 | server-id = 1023309 56 | log-bin = /data/mysql/mysql3309/logs/mysql-bin 57 | binlog_cache_size = 4M 58 | sync_binlog = 0 59 | expire_logs_days = 10 60 | #procedure 61 | log_bin_trust_function_creators=1 62 | 63 | # 64 | gtid-mode = on 65 | enforce-gtid-consistency=1 66 | 67 | 68 | #relay log 69 | skip_slave_start = 1 70 | max_relay_log_size = 128M 71 | relay_log_purge = 1 72 | relay_log_recovery = 1 73 | relay-log=relay-bin 74 | relay-log-index=relay-bin.index 75 | log_slave_updates 76 | #slave-skip-errors=1032,1053,1062 77 | #skip-grant-tables 78 | 79 | master_info_repository=table 80 | relay_log_info_repository=table 81 | #buffers & cache 82 | table_open_cache = 2048 83 | table_definition_cache = 2048 84 | table_open_cache = 2048 85 | max_heap_table_size = 96M 86 | sort_buffer_size = 128K 87 | join_buffer_size = 128K 88 | thread_cache_size = 200 89 | query_cache_size = 0 90 | query_cache_type = 0 91 | query_cache_limit = 256K 92 | query_cache_min_res_unit = 512 93 | thread_stack = 192K 94 | tmp_table_size = 96M 95 | key_buffer_size = 8M 96 | read_buffer_size = 2M 97 | read_rnd_buffer_size = 16M 98 | bulk_insert_buffer_size = 32M 99 | 100 | #myisam 101 | myisam_sort_buffer_size = 128M 102 | myisam_max_sort_file_size = 10G 103 | myisam_repair_threads = 1 104 | 105 | #innodb 106 | innodb_buffer_pool_size = 100M 107 | innodb_buffer_pool_instances = 1 108 | innodb_data_file_path = ibdata1:100M:autoextend 109 | innodb_flush_log_at_trx_commit = 2 110 | innodb_log_buffer_size = 8M 111 | innodb_log_file_size = 200M 112 | innodb_log_files_in_group = 3 113 | innodb_max_dirty_pages_pct = 50 114 | innodb_file_per_table = 1 115 | innodb_rollback_on_timeout 116 | innodb_status_file = 1 117 | innodb_io_capacity = 100 118 | transaction_isolation = READ-COMMITTED 119 | innodb_flush_method = O_DIRECT 120 | 121 | [mysqld_safe] 122 | malloc-lib=/usr/local/mysql/lib/libjemalloc.so 123 | 124 | -------------------------------------------------------------------------------- /zst/zst-wxcode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhishutech/mysqlha-keepalived-3node/ee58cee383fd679ce1f19bd8451f148cd594d457/zst/zst-wxcode.jpg --------------------------------------------------------------------------------