1.集群规划
IP | 类型 | 机房 | 说明 |
---|---|---|---|
10.242.178.130 | consul server | 新港 | Consul v1.10.2 |
10.242.178.131 | consul server | 新港 | Consul v1.10.2 |
10.242.178.129 | consul server | 新港 | Consul v1.10.2 |
10.238.199.17 | mysql+consul client | 新港 | mysql 5.7.19-17 |
10.238.199.18 | mysql+consul client | 新港 | mysql 5.7.19-17 |
2.安装部署
2.1.consul
consul安装部署参考"consul安装部署.md"
2.2.mysql
mysql安装部署参考mysqlrds安装部署手册
3.服务注册
3.1.主从关系
IP | 主从 |
---|---|
10.238.199.17 | 主 |
10.238.199.18 | 从 |
3.2.主库服务注册
10.238.199.17 /opt/consul/etc/client.json
{ "data_dir": "/opt/consul/data", "enable_script_checks": true, "bind_addr": "10.238.199.17", "client_addr": "0.0.0.0", "retry_join": ["10.242.178.129","10.242.178.130","10.242.178.131"], "retry_interval": "5s", "rejoin_after_leave": true, "start_join": ["10.242.178.129","10.242.178.130","10.242.178.131"], "node_name": "10.238.199.17", "datacenter": "xingang", "primary_datacenter":"xingang", "encrypt": "PwGyXsuuc6w0Jx6noxi6PwrN6GeH1HHYBpZ4E77mEwk=", "log_file":"/opt/consul/log/", "log_rotate_duration":"24h", "log_rotate_bytes":10000000, "log_rotate_max_files":100, "encrypt_verify_incoming": true, "encrypt_verify_outgoing": true, "enable_local_script_checks":true, "acl":{ "tokens": { "default":"7a8ea281-c9a2-b559-e3df-578d46752f70" } } }
10.238.199.17 /opt/consul/etc/services.json
{ "services": [ { "name": "mysqlrw", "id": "10.238.199.17_rw", "address": "10.238.199.17", "port": 3306, "check": { "id":"10.238.199.17_rw_ck", "name":"check write domain", "tcp":"10.238.199.17:3306", "interval": "5s", "timeout": "1s" } }, { "name": "mysqlro", "id": "10.238.199.17_ro", "address": "10.238.199.17", "port": 3306, "check": { "id":"10.238.199.17_ro_ck", "name":"check readonly domain", "args":["/bin/bash","/opt/consul/bin/check.sh"], "interval": "5s", "timeout": "1s" } } ] }
10.238.199.17 /opt/consul/bin/check.sh
探测只读域名A记录是否除自己外有无其它A记录且本地3306端口正常,是:返回0(生效自己) 否:返回非0(不生效自己)
rs=`dig +nocmd mysqlro.service.sndbxingang A @10.242.178.129 +noall +answer +time=1 +tries=1|grep mysqlro|grep -v 10.238.199.17|wc -l` rs1=`netstat -anp|grep 3306|grep LISTEN|wc -l` if [ $rs == '0' ] && [ $rs1 == '1' ] then exit 0 fi exit 10
3.3.从库服务注册
10.238.199.18 /opt/consul/etc/client.json
{ "data_dir": "/opt/consul/data", "enable_script_checks": true, "bind_addr": "10.238.199.18", "client_addr": "0.0.0.0", "retry_join": ["10.242.178.129","10.242.178.130","10.242.178.131"], "retry_interval": "5s", "rejoin_after_leave": true, "start_join": ["10.242.178.129","10.242.178.130","10.242.178.131"], "node_name": "10.238.199.18", "datacenter": "xingang", "primary_datacenter":"xingang", "encrypt": "PwGyXsuuc6w0Jx6noxi6PwrN6GeH1HHYBpZ4E77mEwk=", "log_file":"/opt/consul/log/", "log_rotate_duration":"24h", "log_rotate_bytes":10000000, "log_rotate_max_files":100, "encrypt_verify_incoming": true, "encrypt_verify_outgoing": true, "enable_local_script_checks":true, "acl":{ "tokens": { "default":"7a8ea281-c9a2-b559-e3df-578d46752f70" } } }
10.238.199.18 /opt/consul/etc/services.json
{ "services": [ { "name": "mysqlro", "id": "10.238.199.18_ro", "address": "10.238.199.18", "port": 3306, "check": { "id":"10.238.199.18_ro_ck", "name":"check readonly domain", "tcp":"10.238.199.18:3306", "interval": "5s", "timeout": "1s" } } ] }
3.4.域名测试
读写域名
[root@sndspgdpredb352 consul]# dig +nocmd mysqlrw.service.xingang.sndbxingang @10.242.178.132 +noall +answer mysqlrw.service.xingang.sndbxingang. 0 IN A 10.238.199.17
只读域名
[root@sndspgdpredb352 consul]# dig +nocmd mysqlro.service.xingang.sndbxingang @10.242.178.131 +noall +answer mysqlro.service.xingang.sndbxingang. 0 IN A 10.238.199.18
4.在线切换
1.停止主库consul client --读写域名失效
[root@sndspgdpredb353 ~]# ps -ef|grep -i consul root 29264 1 0 11:25 ? 00:00:30 bin/consul agent -config-dir=etc/ root 29365 27700 0 14:55 pts/0 00:00:00 grep -i consul [root@sndspgdpredb353 ~]# kill -9 29264 [root@sndspgdpredb353 ~]# dig +nocmd mysqlrw.service.xingang.sndbxingang @10.242.178.131 +noall +answer
2.mha切换主从 --使用rds脚本模拟mha切换
[root@sndspgdpredb353 ~]# mysql_ha_online_switch -n
3.修改新主/opt/consul/etc/services.json文件并reload --读写只读域名指向新主
[root@sndspgdpredb352 consul]# cat /opt/consul/etc/services.json { "services": [ { "name": "mysqlrw", "id": "10.238.199.18_rw", "address": "10.238.199.18", "port": 3306, "check": { "id":"10.238.199.18_rw_ck", "name":"check write domain", "tcp":"10.238.199.18:3306", "interval": "5s", "timeout": "1s" } }, { "name": "mysqlro", "id": "10.238.199.18_ro", "address": "10.238.199.18", "port": 3306, "check": { "id":"10.238.199.18_ro_ck", "name":"check readonly domain", "args":["/bin/bash","/opt/consul/bin/check.sh"], "interval": "5s", "timeout": "1s" } } ] } [root@sndspgdpredb352 consul]# bin/consul reload [root@sndspgdpredb352 consul]# dig +nocmd mysqlrw.service.xingang.sndbxingang @10.242.178.131 +noall +answer mysqlrw.service.xingang.sndbxingang. 0 IN A 10.238.199.18 [root@sndspgdpredb352 consul]# dig +nocmd mysqlro.service.xingang.sndbxingang @10.242.178.131 +noall +answer mysqlro.service.xingang.sndbxingang. 0 IN A 10.238.199.18
4.修改老主/opt/consul/etc/services.json文件并启动client --只读域名指向老主
[root@sndspgdpredb353 consul]# cat /opt/consul/etc/services.json { "services": [ { "name": "mysqlro", "id": "10.238.199.17_ro", "address": "10.238.199.17", "port": 3306, "check": { "id":"10.238.199.17_ro_ck", "name":"check readonly domain", "tcp":"10.238.199.17:3306", "interval": "5s", "timeout": "1s" } } ] } [root@sndspgdpredb353 consul]# nohup bin/consul agent --config-dir=etc/ >/dev/null & [1] 5708 nohup: ignoring input and redirecting stderr to stdout [root@sndspgdpredb353 consul]# dig +nocmd mysqlro.service.xingang.sndbxingang @10.242.178.131 +noall +answer mysqlro.service.xingang.sndbxingang. 0 IN A 10.238.199.17
5.故障切换
5.1.从库宕机
从库:10.238.199.17 --宕机场景包括:1.数据库进程停止 2.服务器宕机(consul client失联)
-
数据库进程停止 --只读域名A记录自动切换至主库
[root@sndspgdpredb353 consul]# dig +nocmd mysqlro.service.xingang.sndbxingang @10.242.178.131 +noall +answer mysqlro.service.xingang.sndbxingang. 0 IN A 10.238.199.18
-
数据库进程启动 --只读域名A记录自动切换至从库
[root@sndspgdpredb353 consul]# dig +nocmd mysqlro.service.xingang.sndbxingang @10.242.178.131 +noall +answer mysqlro.service.xingang.sndbxingang. 0 IN A 10.238.199.17
-
consul client进程停止 --只读域名A记录自动切换至主库
[root@sndspgdpredb353 consul]# dig +nocmd mysqlro.service.xingang.sndbxingang @10.242.178.131 +noall +answer mysqlro.service.xingang.sndbxingang. 0 IN A 10.238.199.18
-
consul client进程启动 --只读域名A记录自动切换至从库
[root@sndspgdpredb353 consul]# dig +nocmd mysqlro.service.xingang.sndbxingang @10.242.178.131 +noall +answer mysqlro.service.xingang.sndbxingang. 0 IN A 10.238.199.17
5.2.主库宕机
主库:10.238.199.18
1.mha切换10.238.199.17为新主 ---使用rds脚本模拟mha切换
[root@sndspgdpredb353 ~]# mysql_ha_failover
2.修改新主/opt/consul/etc/services.json文件并reload --读写只读域名指向新主
[root@sndspgdpredb353 consul]# cat /opt/consul/etc/services.json { "services": [ { "name": "mysqlrw", "id": "10.238.199.17_rw", "address": "10.238.199.17", "port": 3306, "check": { "id":"10.238.199.17_rw_ck", "name":"check write domain", "tcp":"10.238.199.17:3306", "interval": "5s", "timeout": "1s" } }, { "name": "mysqlro", "id": "10.238.199.17_ro", "address": "10.238.199.17", "port": 3306, "check": { "id":"10.238.199.17_ro_ck", "name":"check readonly domain", "args":["/bin/bash","/opt/consul/bin/check.sh"], "interval": "5s", "timeout": "1s" } } ] } [root@sndspgdpredb353 consul]# bin/consul reload [root@sndspgdpredb353 consul]# dig +nocmd mysqlro.service.xingang.sndbxingang @10.242.178.131 +noall +answer mysqlro.service.xingang.sndbxingang. 0 IN A 10.238.199.17 [root@sndspgdpredb353 consul]# dig +nocmd mysqlrw.service.xingang.sndbxingang @10.242.178.131 +noall +answer mysqlrw.service.xingang.sndbxingang. 0 IN A 10.238.199.17
3.老主恢复后修改/opt/consul/etc/services.json并启动client(复制状态恢复前确保consul进程停止,防止读写域名注册) --只读域名指向老主
[root@sndspgdpredb352 consul]# cat etc/services.json { "services": [ { "name": "mysqlro", "id": "10.238.199.18_ro", "address": "10.238.199.18", "port": 3306, "check": { "id":"10.238.199.18_ro_ck", "name":"check readonly domain", "tcp":"10.238.199.18:3306", "interval": "5s", "timeout": "1s" } } ] } [root@sndspgdpredb352 consul]# bin/consul reload Error reloading: Put "http://127.0.0.1:8500/v1/agent/reload": dial tcp 127.0.0.1:8500: connect: connection refused [root@sndspgdpredb352 consul]# nohup bin/consul agent --config-dir=etc/ >/dev/null & [1] 10513 nohup: ignoring input and redirecting stderr to stdout [root@sndspgdpredb352 consul]# dig +nocmd mysqlrw.service.xingang.sndbxingang @10.242.178.131 +noall +answer mysqlrw.service.xingang.sndbxingang. 0 IN A 10.238.199.17 [root@sndspgdpredb352 consul]# dig +nocmd mysqlro.service.xingang.sndbxingang @10.242.178.131 +noall +answer mysqlro.service.xingang.sndbxingang. 0 IN A 10.238.199.18