准备工作:
完成 keepalived 的安装
完成 docker 的安装
docker 镜像里面自行安装 iproute2, vim, iputils-ping(可选)等工具, 便于测试
- apt-get install iproute2
- apt-get install vim
- apt-get install iputils-ping
主数据库 master
1. 使用 docker 安装 mysql
- mkdir -p ~/compose/mysql-master
- cd ~/compose/mysql-master
- cat docker-compose.yml
- version: '2'
- services:
- mysql-master:
- image: mysql:5
- restart: always
- container_name: mysql-master
- ports:
- - 3306:3306
- volumes:
- - ./conf.d:/etc/mysql/conf.d
- - /data/docker/mysql-master/data:/var/lib/mysql
- environment:
- - MYSQL_ROOT_PASSWORD=123456
- networks:
- default:
- external:
- name: service
假如没有把 3306 端口映射到宿主机, 在宿主机上可通过 docker-ip:3306 来访问.
2. mysql 的配置
- cat conf.d/lowercase.cnf
- [mysqld]
- lower_case_table_names = 1
- default-time-zone = '+08:00'
- character-set-server = utf8
- event_scheduler = on
- log-bin = mysql-bin
- server-id = 1
参数说明:
lower_case_table_names
设置不区分大小写
default-time-zone 设置时区为东八区
character-set-server
修改字符集为 utf8
log-bin 开启二进制日志
server-id 设置 server-id
master 开启二进制日志后默认记录所有库所有表的操作, 可以通过配置来指定只记录指定的数据库甚至指定的表的操作, 具体在 mysql 配置文件的 [mysqld] 可添加修改如下选项:
- # 不同步哪些数据库
- binlog-ignore-db = mysql
- binlog-ignore-db = test
- binlog-ignore-db = information_schema
- # 只同步哪些数据库, 除此之外, 其他不同步
- binlog-do-db = mydatabase
3. 启动服务
docker-compose pull && docker-compose up -d
4. 在宿主机连接 mysql
说明: 由于我是使用虚拟机安装的字符版 Ubuntu 系统, 所以使用 MyCli https://github.com/jaywcjlove/mysql-tutorial/blob/master/chapter2/2.4.md#mycli替代mysql的mysql命令行工具 作为 mysql 命令行工具来连接 mysql.
- # 查看 master 主机的 ip 地址为 192.168.11.188, 使用 MyCli 连接 mysql
- mycli -h 192.168.11.188 -u root -p 123456
- # 给 root 用户分配远程访问权限:
- grant all on *.* to root@'%' identified by "123456";
- flush privileges;
- # 查看 master 状态
- mysql root@192.168.11.188:(none)> SHOW MASTER STATUS;
- +------------------+----------+--------------+------------------+-------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
- +------------------+----------+--------------+------------------+-------------------+
- | mysql-bin.000003 | 586 | | | |
- +------------------+----------+--------------+------------------+-------------------+
- 1 row in set
- Time: 0.004s
需要记录主数据库的二进制文件名 (mysql-bin.000003) 和位置 586.
从数据库 slave
1. docker-compose.yml
只需要从主数据库的配置名称由 mysql-master 改为 mysql-slave 即可.
2. mysql 配置
- cat conf.d/lowercase.cnf
- [mysqld]
- lower_case_table_names = 1
- default-time-zone = '+08:00'
- character-set-server = utf8
- event_scheduler = on
- server-id= 2
需添加 server-id 并且与主数据库中不一致
3. 启动服务
docker-compose pull && docker-compose up -d
4. 在宿主机连接 mysql
- # 查看 slave 主机的 ip 地址为 192.168.11.186, 使用 MyCli 连接 mysql
- mycli -h 192.168.11.186 -u root -p 123456
- # 给 root 用户分配远程访问权限, 略
- # 执行同步 SQL 语句, 参照 MASTER 配置:
- CHANGE MASTER TO MASTER_HOST='192.168.11.188',MASTER_USER='root',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=586;
- # 启动 slave 同步进程
- start slave;
- # 查看 slave 状态:
- show slave status\G;
其中下面两项为 YES 则表示成功:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
测试主从复制
在 MASTER 中新建数据库和表, 发现数据在 SLAVE 中已经实时同步过来
Keepalived 监控 mysql 服务
1. master 主机上的配置
- cat /etc/keepalived/keepalived.conf
- vrrp_script chk_mysql_port { #检测 mysql 服务是否在运行. 有很多方式, 比如进程, 用脚本检测等等
- script "/opt/chk_mysql.sh" #这里通过脚本监测
- interval 2 #脚本执行间隔, 每 2s 检测一次
- weight -5 #脚本结果导致的优先级变更, 检测失败 (脚本返回非 0) 则优先级 -5
- fall 2 #检测连续 2 次失败才算确定是真失败. 会用 weight 减少优先级(1-255 之间)
- rise 1 #检测 1 次成功就算成功. 但不修改优先级
- }
- vrrp_instance VI_1 {
- state MASTER
- interface ens33 #指定虚拟 ip 的网卡接口, 不一定是 eth0 根据 ifconfig 确定
- virtual_router_id 51 #路由器标识, MASTER 和 BACKUP 必须是一致的
- priority 100 #定义优先级, 数字越大, 优先级越高, 在同一个 vrrp_instance 下, MASTER 的优先级必须大于 BACKUP 的优先级. 这样 MASTER 故障恢复后, 就可以将 VIP 资源再次抢回来
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 123456
- }
- virtual_ipaddress {
- 192.168.11.25
- }
- track_script {
- chk_mysql_port
- }
- }
需要配置的地方有: script,state,interface,virtual_router_id,priority,virtual_ipaddress 等
2. slave 主机上的配置
- cat /etc/keepalived/keepalived.conf
- vrrp_script chk_mysql_port {
- script "/opt/chk_mysql.sh"
- interval 2
- weight -5
- fall 2
- rise 1
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 51
- priority 99
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 123456
- }
- virtual_ipaddress {
- 192.168.11.25
- }
- track_script {
- chk_mysql_port
- }
- }
只需要设置 state 为 BACKUP, priority 比 MASTER 低即可.
3. 监测监本的配置
- cat /opt/chk_mysql.sh
- #!/bin/bash
- counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
- if [ "${counter}" -eq 0 ]
- then
- /etc/init.d/keepalived stop
- else
- echo "running...">> /opt/keepalived-running-info.log
- sleep 5000
- fi
Keepalived 监测 Mysql 测试
先要保证两台服务器的 mysql 服务正常启动哦~
1. 启动 Keepalived
- # 在 master 和 slave 上执行
- sudo /etc/init.d/keepalived start
- # 查看脚本是否正常执行
- tail -f /opt/keepalived-running-info.log
- # 查看 master 的 ip, 发现虚拟 ip 绑定成功
- ip addr
- 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
- link/ether 00:0c:29:64:35:17 brd ff:ff:ff:ff:ff:ff
- inet 192.168.11.188/24 brd 192.168.11.255 scope global ens33
- valid_lft forever preferred_lft forever
- inet 192.168.11.25/32 scope global ens33
- valid_lft forever preferred_lft forever
- inet6 fe80::20c:29ff:fe64:3517/64 scope link
- valid_lft forever preferred_lft forever
2. 高可用测试
在任意一台主机执行以下命令测试:
- mycli -h 192.168.11.25 -u root -p 123456 #ok
- mycli -h 192.168.11.188 -u root -p 123456 #ok
- mycli -h 192.168.11.186 -u root -p 123456 #ok
再次查看 master 主机的 ip, 发现虚拟 ip 不见了:
- ip addr
- 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
- link/ether 00:0c:29:64:35:17 brd ff:ff:ff:ff:ff:ff
- inet 192.168.11.188/24 brd 192.168.11.255 scope global ens33
- valid_lft forever preferred_lft forever
- inet6 fe80::20c:29ff:fe64:3517/64 scope link
- valid_lft forever preferred_lft forever
此时查看 slave 主机的 ip 定, 发现 ip 漂移情况, 虚拟 ip 自动绑定到到了 slave 主机上:
- ip addr
- 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
- link/ether 00:0c:29:f0:00:ad brd ff:ff:ff:ff:ff:ff
- inet 192.168.11.186/24 brd 192.168.11.255 scope global ens33
- valid_lft forever preferred_lft forever
- inet 192.168.11.25/32 scope global ens33
- valid_lft forever preferred_lft forever
- inet6 fe80::20c:29ff:fef0:ad/64 scope link
- valid_lft forever preferred_lft forever
此时查看 slave 主机情况, Slave_IO_Running 变成了 Connecting:
- mycli -h 192.168.11.186 -u root -p 123456
- show slave status\G;
- Slave_IO_Running | Connecting
- Slave_SQL_Running | Yes
继续测试
现在把 master 重新启动
- mycli -h 192.168.11.188 -u root -p 123456 #ok
- show master status;
- +------------------+----------+--------------+-------------------------------+-------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
- +------------------+----------+--------------+-------------------------------+-------------------+
- | mysql-bin.000009 | 154 | | mysql,test,information_schema | |
- +------------------+----------+--------------+-------------------------------+-------------------+
- 1 row in set
- Time: 0.004s
会发现信息发生了改变, 再次查看 slave 的状态恢复正常:
- Slave_IO_Running | Yes
- Slave_SQL_Running | Yes
继续查看 master 主机发现未绑定 vip,vip 依然存在于 slave 所属主机上面.
那么现在把 slave 停掉试试看:
- docker stop mysql-slave
- mycli -h 192.168.11.186 -u root -p 123456 #error
- mycli -h 192.168.11.25 -u root -p 123456 # error
- mycli -h 192.168.11.188 -u root -p 123456 # ok
出现只有 master 主机的 mysql 服务能访问的情况, 是因为上面测试把两个 mysql 服务停止, 脚本监测不到 3306 端口执行了
/etc/init.d/keepalived stop
, 所以需要重新启动 keepalived :
- # master 主机
- sudo /etc/init.d/keepalived start
- # slave 主机
- docker start mysql-slave
- sudo /etc/init.d/keepalived start
这个时候发现 vip 又重新绑定到 master 上面, OK, 一切正常.
总结:
写的可能有些啰嗦, 但是每一步的操作和测试又是必要的, 只为记录自己的一次学习心得.
来源: https://www.cnblogs.com/UUUP/p/9235200.html