珠海柏泰教育官方网站建设,台州网站建设网站,东莞seo建站广告费,360网站推广文章目录 [toc]部署 mysql关闭防火墙关闭 selinux创建相关目录创建 mysql 用户配置 PATH 变量验证 mysql 命令切换到 mysql 用户在 172.72.0.116 生成配置文件在 172.72.0.137 生成配置文件mysql 初始化启动 mysql 服务修改 mysql 的 root 用户密码配置主从关系172.72.0.137 配… 文章目录 [toc]部署 mysql关闭防火墙关闭 selinux创建相关目录创建 mysql 用户配置 PATH 变量验证 mysql 命令切换到 mysql 用户在 172.72.0.116 生成配置文件在 172.72.0.137 生成配置文件mysql 初始化启动 mysql 服务修改 mysql 的 root 用户密码配置主从关系172.72.0.137 配置成 172.72.0.116 的从库172.72.0.116 配置成 172.72.0.137 的从库 主从复制验证 部署 haproxy创建 haproxy 配置文件启动 haproxy验证 haproxy 登录到 mysql 部署 keepalivedKeepalived 工作原理抢占和非抢占模式在 172.72.0.116 创建 keepalived 配置文件在 172.72.0.137 创建 keepalived 配置文件配置 haproxy 健康检测脚本启动 keepalived 服务验证 VIP 登录 mysql 验证高可用是否有效当一台 mysql 服务无进程验证 keepalived 是否为非抢占模式当一台 haproxy 服务无进程mysql 服务均正常 话不多说直接开搞 ip服务172.72.0.116keepalivedhaproxymysql172.72.0.137keepalivedhaproxymysql172.72.0.100VIP 部署前大家先要确认集群之间的时间是否一致集群类的服务最怕时间不一致 部署 mysql
Mysql 二进制文件下载地址 部署相关的操作两台机器都需要执行需要执行指定机器时会额外提示 关闭防火墙
systemctl disable firewalld --now关闭 selinux
setenforce 0
sed -i /SELINUX/s/enforcing/disabled/g /etc/selinux/config创建相关目录
mkdir -p /data/{software,mysql/{config,logs},script,mysql-back}创建完成后的目录结构如下 /data/
├── mysql
│ ├── config
│ ├── logs
│ ├── mysql_data
├── mysql-back
├── script
└── software解压下载好的二进制文件 tar xf mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz创建 mysql 用户
useradd mysql
# 配置用户密码
echo mysqldba | passwd --stdin mysql给对应的目录和文件修改权限 chown -R mysql /data/software/mysql-5.7.29-linux-glibc2.12-x86_64
chown -R mysql /data/mysql
chown -R mysql /data/mysql-back配置 PATH 变量
echo MYSQL_HOME/data/software/mysql-5.7.29-linux-glibc2.12-x86_64 /etc/profile
echo PATH${PATH}:${MYSQL_HOME}/bin /etc/profile
source /etc/profile验证 mysql 命令 查看是否缺少依赖库 ldd /data/software/mysql-5.7.29-linux-glibc2.12-x86_64/bin/mysql例如我这边缺了俩依赖 linux-vdso.so.1 (0x00007ffe91b5a000)libpthread.so.0 /lib64/libpthread.so.0 (0x00007f495203f000)librt.so.1 /lib64/librt.so.1 (0x00007f4951e37000)libdl.so.2 /lib64/libdl.so.2 (0x00007f4951c33000)libncurses.so.5 not foundlibstdc.so.6 /lib64/libstdc.so.6 (0x00007f495189e000)libm.so.6 /lib64/libm.so.6 (0x00007f495151c000)libgcc_s.so.1 /lib64/libgcc_s.so.1 (0x00007f4951304000)libc.so.6 /lib64/libc.so.6 (0x00007f4950f3e000)/lib64/ld-linux-x86-64.so.2 (0x00007f495225f000)libtinfo.so.5 not found找一下是否有高版本的依赖 find / -type f -name libncurses.so*尝试用软连接 ln -s /usr/lib64/libncurses.so.6.1 /usr/lib64/libncurses.so.5再次使用上面的 ldd 命令去检查依赖发现不是 not found 了用这个办法再去解决剩下的依赖缺失 验证 mysql 命令能不能正常使用 mysql -V可以获取到当前的 mysql 客户端版本 mysql Ver 14.14 Distrib 5.7.29, for linux-glibc2.12 (x86_64) using EditLine wrapper切换到 mysql 用户 后续的操作都使用 mysql 用户 su - mysql在 172.72.0.116 生成配置文件
cat EOF /data/mysql/config/my.cnf
[mysqld]
pid-file/data/mysql/mysqld.pid
socket/data/mysql/mysqld.sock
datadir/data/mysql/mysql_data
log-error/data/mysql/logs/error.log
port13306
# MySQL 在运行时需要 errmsg.sys 文件来显示和报告错误消息
lc-messages-dir/data/software/mysql-5.7.29-linux-glibc2.12-x86_64/share/englishserver_id116# binlog
# binlog 文件的名称
log_binmysql-bin
# 设置每个二进制日志文件的最大大小
max_binlog_size100m
# 设置用于缓存二进制日志事件的缓冲区大小
binlog_cache_size4m
# 设置 binlog 缓存的最大大小
max_binlog_cache_size512m
# binlog 类型
binlog_formatMIXED
# binlog 过期时间
expire_logs_days7bind-address0.0.0.0
# 是否允许在数据库目录下使用符号链接
## symbolic-links0表示不允许使用符号链接。如果设置为 0MySQL 服务器在启动时将不会使用数据库目录下的符号链接并且可能会在符号链接存在时报错。
## symbolic-links1表示允许使用符号链接。如果设置为 1MySQL 服务器在启动时将允许使用数据库目录下的符号链接但仅限于特定目录或文件根据权限设置。
## symbolic-links2表示允许使用符号链接且没有限制。如果设置为 2MySQL 服务器在启动时将允许使用数据库目录下的任意符号链接包括对任意文件或目录的链接。
symbolic-links0
# mysql 最大连接数
max_connections1000
# 默认存储引擎
default_storage_engineinnodb
# 禁用外部锁定MySQL 将使用内部锁定来代替外部锁定
skip_external_locking
# 0表名存储为原始大小写区分大小写
# 1表名存储为小写不区分大小写
# 2表名存储为小写但会在文件系统上进行名称比较因此会区分大小写。
lower_case_table_names1
# 禁用主机缓存每次都要重新解析域名
skip_host_cache
# 开启主机名解析
skip_name_resolve
# 设置服务器的默认字符集
character_set_serverutf8
# 客户端与服务器之间允许的最大数据包大小
max_allowed_packet12M
# 控制 SQL 的执行模式
## STRICT_TRANS_TABLES启用严格模式对于事务表如果有非法数据插入或更新将会引发错误
## NO_ZERO_IN_DATE禁止在日期中使用 0000-00-00 这样的零值否则会被转换为 NULL 值
## ERROR_FOR_DIVISION_BY_ZERO当除零错误发生时产生错误而不是返回 NULL 值
## NO_AUTO_CREATE_USER禁止 GRANT 语句自动创建新用户必须手动创建
## NO_ENGINE_SUBSTITUTION如果指定的存储引擎不可用或不存在不要自动替换为其他可用的存储引擎而应该返回错误
sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION[client]
# 设置 MySQL 客户端连接的默认字符集
character-set-clientutf8
EOF在 172.72.0.137 生成配置文件
cat EOF /data/mysql/config/my.cnf
[mysqld]
pid-file/data/mysql/mysqld.pid
socket/data/mysql/mysqld.sock
datadir/data/mysql/mysql_data
log-error/data/mysql/logs/error.log
port13306
# MySQL 在运行时需要 errmsg.sys 文件来显示和报告错误消息
lc-messages-dir/data/software/mysql-5.7.29-linux-glibc2.12-x86_64/share/englishserver_id137# binlog
# binlog 文件的名称
log_binmysql-bin
# 设置每个二进制日志文件的最大大小
max_binlog_size100m
# 设置用于缓存二进制日志事件的缓冲区大小
binlog_cache_size4m
# 设置 binlog 缓存的最大大小
max_binlog_cache_size512m
# binlog 类型
binlog_formatMIXED
# binlog 过期时间
expire_logs_days7bind-address0.0.0.0
# 是否允许在数据库目录下使用符号链接
## symbolic-links0表示不允许使用符号链接。如果设置为 0MySQL 服务器在启动时将不会使用数据库目录下的符号链接并且可能会在符号链接存在时报错。
## symbolic-links1表示允许使用符号链接。如果设置为 1MySQL 服务器在启动时将允许使用数据库目录下的符号链接但仅限于特定目录或文件根据权限设置。
## symbolic-links2表示允许使用符号链接且没有限制。如果设置为 2MySQL 服务器在启动时将允许使用数据库目录下的任意符号链接包括对任意文件或目录的链接。
symbolic-links0
# mysql 最大连接数
max_connections1000
# 默认存储引擎
default_storage_engineinnodb
# 禁用外部锁定MySQL 将使用内部锁定来代替外部锁定
skip_external_locking
# 0表名存储为原始大小写区分大小写
# 1表名存储为小写不区分大小写
# 2表名存储为小写但会在文件系统上进行名称比较因此会区分大小写。
lower_case_table_names1
# 禁用主机缓存每次都要重新解析域名
skip_host_cache
# 开启主机名解析
skip_name_resolve
# 设置服务器的默认字符集
character_set_serverutf8
# 客户端与服务器之间允许的最大数据包大小
max_allowed_packet12M
# 控制 SQL 的执行模式
## STRICT_TRANS_TABLES启用严格模式对于事务表如果有非法数据插入或更新将会引发错误
## NO_ZERO_IN_DATE禁止在日期中使用 0000-00-00 这样的零值否则会被转换为 NULL 值
## ERROR_FOR_DIVISION_BY_ZERO当除零错误发生时产生错误而不是返回 NULL 值
## NO_AUTO_CREATE_USER禁止 GRANT 语句自动创建新用户必须手动创建
## NO_ENGINE_SUBSTITUTION如果指定的存储引擎不可用或不存在不要自动替换为其他可用的存储引擎而应该返回错误
sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION[client]
# 设置 MySQL 客户端连接的默认字符集
character-set-clientutf8
EOFmysql 初始化
mysqld --initialize-insecure \
--usermysql \
--basedir${MYSQL_HOME} \
--datadir/data/mysql/mysql_data启动 mysql 服务
${MYSQL_HOME}/bin/mysqld \
--defaults-file/data/mysql/config/my.cnf --daemonize \
--plugin-dir${MYSQL_HOME}/lib/plugin修改 mysql 的 root 用户密码 进入 mysql初始化的时候没有设定密码直接回车就可以了 mysql -uroot -p -S /data/mysql/mysqld.sock修改密码 SET PASSWORD FOR rootlocalhost PASSWORD (YWJjMTIzCg);配置主从关系 以下的配置都是基于新部署的数据库实现的如果当前数据库本身存在数据的情况下需要先把 master 的数据备份然后在 slave 节点上恢复数据后再进行主从配置 172.72.0.137 配置成 172.72.0.116 的从库 在 172.72.0.116 的 mysql 里面操作创建一个从复制专用的用户 CREATE USER rpldb% IDENTIFIED BY cnBsZGIwMDcK;
GRANT REPLICATION SLAVE ON *.* TO rpldb%;查看 binlog 的文件名称和 Position 信息 SHOW MASTER STATUS\G获取到类似如下的信息 *************************** 1. row ***************************File: mysql-bin.000001Position: 841Binlog_Do_DB:Binlog_Ignore_DB: sys,mysql,performance_schema,information_schema
Executed_Gtid_Set:
1 row in set (0.00 sec)在 172.72.0.137 的 mysql 里面操作 CHANGE MASTER TO MASTER_HOST172.72.0.116, MASTER_PORT13306, MASTER_USERrpldb, MASTER_PASSWORDcnBsZGIwMDcK, MASTER_LOG_FILEmysql-bin.000001, MASTER_LOG_POS841;启动复制 STOP SLAVE;
START SLAVE;查看复制是否成功 SHOW SLAVE STATUS\G看到这两个都是 yes表示主从复制已经建立成功了 Slave_IO_Running: YesSlave_SQL_Running: Yes172.72.0.116 配置成 172.72.0.137 的从库 在 172.72.0.137 的 mysql 里面操作创建一个从复制专用的用户 CREATE USER rpldb% IDENTIFIED BY cnBsZGIwMDcK;
GRANT REPLICATION SLAVE ON *.* TO rpldb%;查看 binlog 的文件名称和 Position 信息 SHOW MASTER STATUS\G获取到类似如下的信息 *************************** 1. row ***************************File: mysql-bin.000001Position: 841Binlog_Do_DB:Binlog_Ignore_DB: sys,mysql,performance_schema,information_schema
Executed_Gtid_Set:
1 row in set (0.00 sec)在 172.72.0.116 的 mysql 里面操作 CHANGE MASTER TO MASTER_HOST172.72.0.137, MASTER_PORT13306, MASTER_USERrpldb, MASTER_PASSWORDcnBsZGIwMDcK, MASTER_LOG_FILEmysql-bin.000001, MASTER_LOG_POS841;启动复制 STOP SLAVE;
START SLAVE;查看复制是否成功 SHOW SLAVE STATUS\G看到这两个都是 yes表示主从复制已经建立成功了 Slave_IO_Running: YesSlave_SQL_Running: Yes主从复制验证 先使用 mysql root 用户创建一个库 create database music;再创建一个 mysql 的普通用户并且对 music 库有增改查的权限 CREATE USER vinci% IDENTIFIED BY DavVinci;
GRANT SELECT,UPDATE,INSERT,CREATE ON music.* TO vinci%;使用 vinci 用户登录到 172.72.0.116 的 mysql进行建库建表 CREATE TABLE music.favorite(name char(10),music_name char(20)
)charsetutf8;插入几条数据 INSERT INTO music.favorite(name, music_name) VALUES
(Eason Chan,遥远的她),
(Ronald,怪胎),
(Hacken Lee,李香兰);使用 vinci 用户登录到 172.72.0.137 的 mysql查看数据是否存在 SELECT music_name FROM music.favorite WHERE nameRonald limit 5;部署 haproxy
官网http://www.haproxy.comHAProxy提供高可用性、负载均衡以及基于TCP和HTTP的应用代理支持虚拟主机它是免费、快速并且可靠的一种负载均衡解决方案。适合处理高负载站点的七层数据请求。类似的代理服务可以屏蔽内部真实服务器防止内部服务器遭受攻击。 使用 yum 安装 yum install -y haproxy创建 haproxy 配置文件 备份原来的配置文件 cp /etc/haproxy/haproxy.cfg{,.bak}创建配置文件 cat EOF /etc/haproxy/haproxy.cfg
global log 127.0.0.1 local3 info # 在本机记录日志maxconn 65535 # 每个进程可用的最大连接数chroot /data/haproxy # haproxy 安装目录pidfile /data/haproxy/haproxy.pid # haproxy pid 文件目录uid 994 # 运行 haproxy 的用户uidid haproxy 命令可以查看gid 991 # 运行 haproxy 的用户组idid haproxy 命令可以查看daemon # 以后台守护进程运行defaultslog globalmode http # 运行模式 tcp、 http、 healthretries 3 # 三次连接失败则判断服务不可用option redispatch # 如果后端有服务器宕机强制切换到正常服务器stats uri /haproxy # 统计页面 URL 路径stats refresh 30s # 统计页面自动刷新时间stats realm haproxy-status # 统计页面输入密码框提示信息stats auth admin:YWJjMTIzCg # 统计页面用户名和密码stats hide-version # 隐藏统计页面上 HAProxy 版本信息maxconn 65535 # 每个进程可用的最大连接数timeout connect 5000 # 连接超时 timeout client 50000 # 客户端超时timeout server 50000 # 服务器端超时frontend http_haproxymode http # 运行模式 tcp、 http、 healthmaxconn 65535 # 每个进程可用的最大连接数bind :18080 # 监听 18080 端口log global option httplog option httpclose # 每次请求完毕后主动关闭 http 通道frontend mysqls # 自定义描述信息mode tcp # 运行模式 tcp、 http、 healthmaxconn 65535 # 每个进程可用的最大连接数bind *:13307 # 监听 13307 端口default_backend mysql_backendbackend mysql_backendmode tcpbalance roundrobin # 设置负载均衡模式source 保存 session 值roundrobin 轮询模式# rise 2是2次正确认为服务器可用# fall 3是3次失败认为服务器不可用server mysql01 172.72.0.116:13306 check inter 5s rise 2 fall 3server mysql02 172.72.0.137:13306 check inter 5s rise 2 fall 3
EOF给 haproxy 的 chroot 目录授权 mkdir /data/haproxy
chown -R haproxy /data/haproxy启动 haproxy
systemctl enable haproxy
systemctl start haproxy可以在浏览器输入 172.72.0.116:18080/haproxy 或者 172.72.0.137:18080/haproxy 来验证是否可以看到统计页面这里的 ip大家以自己实际的为准 验证 haproxy 登录到 mysql haproxy 正确的情况下两个地址都可以用 13307 端口来登录到 mysql 内 mysql -uvinci -pDavVinci -h172.72.0.116 -P13307
mysql -uvinci -pDavVinci -h172.72.0.137 -P13307部署 keepalived
Keepalived 工作原理 keepalived 是以 VRRP 协议为实现基础的VRRP 全称 Virtual Router Redundancy Protocol ,即虚拟路由冗余协议。 虚拟路由冗余协议可以认为是实现路由器高可用的协议。也就是说N台提供相同功能的路由器组成一个路由器组这个组里面有一个 master 和多个 backupmaster上面有一个对外提供服务的vipmaster 不断向 backup 发送心跳信息告诉 backup 自己还活着当 backup 收不到心跳消息时就认为 master 已经宕机啦这时就需要根据 VRRP 的优先级来选举一个 backup 当 master。从而保证高可用。 keepalived主要有三个模块分别是 core、check 和 vrrp。 core 模块为 keepalived 的核心负责主进程的启动、维护、以及全局配置文件的加载和解析。check 负责健康检查包括常见的各种检查方式。vrrp 模块是来实现 VRRP 协议的。 vrrp 虚拟路由冗余协议 使用ip报文作为传输协议协议号112使用固定组播网络 224.0.0.18 进行发送只是用advertisement报文 master路由器的选举 比较每台路由器设备的优先级优先级大的为 master。优先级相同的比较接口IP地址地址大的成为 mastermaster 会主动周期的发送 advertisement 报文一秒发送一次backup 如果 3 秒没有接到 master 发送的 advertisment 报文就说明 master down
抢占和非抢占模式
摘抄自MySQL Keepalived 双主热备高可用操作记录
keepalive 通过组播单播等方式自定义实现 keepalive 主备推选。工作模式分为抢占和非抢占通过参数 nopreempt 来控制。 抢占模式 主服务正常工作时虚拟 IP 会在主上备不提供服务当主服务优先级低于备的时候备会自动抢占虚拟 IP这时主不提供服务备提供服务。 也就是说工作在抢占模式下不分主备只管优先级。不管 keepalived.conf 里的 state 配置成 master 还是 backup只看谁的 priority 优先级高一般而言state 为 MASTER 的优先级要高于 BACKUP。priority 优先级高的那一个在故障恢复后会自动将 VIP 资源再次抢占回来 非抢占模式 这种方式通过参数 nopreempt一般设置在 advert_int 的那一行下面来控制。不管 priority 优先级只要 MASTER 机器发生故障VIP 资源就会被切换到 BACKUP 上。 并且当 MASTER 机器恢复后也不会去将 VIP 资源抢占回来直至 BACKUP 机器发生故障时才能自动切换回来。
千万注意 nopreempt 这个参数只能用于 state 为 backup 的情况所以在配置的时候要把 master 和 backup 的 state 都设置成 backup这样才会实现 keepalived 的非抢占模式 也就是说 当 state 状态一个为 master一个为 backup 的时候加不加 nopreempt 这个参数都是一样的效果。即都是根据 priority 优先级来决定谁抢占 vip 资源的是抢占模式当 state 状态都设置成 backup如果不配置 nopreempt 参数那么也是看 priority 优先级决定谁抢占 vip 资源即也是抢占模式。当 state 状态都设置成 backup如果配置 nopreempt 参数那么就不会去考虑 priority 优先级了是非抢占模式即只有 vip 当前所在机器发生故障另一台机器才能接管 vip。即使优先级高的那一台机器恢复 后也不会主动抢回 vip只能等到对方发生故障才会将 vip 切回来。 使用 yum 安装 yum install -y keepalived在 172.72.0.116 创建 keepalived 配置文件 备份原来的配置文件 cp /etc/keepalived/keepalived.conf{,.bak}创建配置文件这里采用非抢占模式 cat EOF /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {# 每个 keepalived 要配置成不一样的router_id mysql1
}# 作用添加一个周期性执行的脚本。
## 脚本的退出状态码会被调用它的所有的VRRP Instance记录。
## 注意至少有一个VRRP实例调用它并且优先级不能为0。
## 优先级范围是1-254用来做健康检查的当检查失败时会将 vrrp_instance 的 priority 减少相应的值
vrrp_script chk_haproxy {# 监控服务脚本脚本x执行权限script /data/script/chk_haproxy.sh# 检测时间间隔(执行脚本间隔)interval 2weight -2# 解释 weight## 如果脚本执行成功(退出状态码为0)weight大于0则priority增加。## 如果脚本执行失败(退出状态码为非0)weight小于0则priority减少。## 其他情况下priority不变。
}vrrp_instance VI_1 {state BACKUP# 指定虚拟 ip 的网卡接口根据自己实际网卡名称修改interface ens160# 路由器标识MASTER 和 BACKUP 必须是一致的virtual_router_id 51# 定义优先级数字越大优先级越高在同一个 vrrp_instance 下MASTER 的优先级必须大于 BACKUP 的优先级。这样 MASTER 故障恢复后就可以将VIP资源再次抢回来priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.72.0.100}# 添加此行表示非抢占模式# nopreempttrack_script {chk_haproxy}
}
EOF在 172.72.0.137 创建 keepalived 配置文件 备份原来的配置文件 cp /etc/keepalived/keepalived.conf{,.bak}创建配置文件这里采用非抢占模式 cat EOF /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {# 每个 keepalived 要配置成不一样的router_id mysql2
}# 作用添加一个周期性执行的脚本。
## 脚本的退出状态码会被调用它的所有的VRRP Instance记录。
## 注意至少有一个VRRP实例调用它并且优先级不能为0。
## 优先级范围是1-254用来做健康检查的当检查失败时会将 vrrp_instance 的 priority 减少相应的值
vrrp_script chk_haproxy {# 监控服务脚本脚本x执行权限script /data/script/chk_haproxy.sh# 检测时间间隔(执行脚本间隔)interval 2weight -2# 解释 weight## 如果脚本执行成功(退出状态码为0)weight大于0则priority增加。## 如果脚本执行失败(退出状态码为非0)weight小于0则priority减少。## 其他情况下priority不变。
}vrrp_instance VI_1 {state BACKUP# 指定虚拟 ip 的网卡接口根据自己实际网卡名称修改interface ens160# 路由器标识MASTER 和 BACKUP 必须是一致的virtual_router_id 51# 定义优先级数字越大优先级越高在同一个 vrrp_instance 下MASTER 的优先级必须大于 BACKUP 的优先级。这样 MASTER 故障恢复后就可以将VIP资源再次抢回来priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.72.0.100}# 添加此行表示非抢占模式# nopreempttrack_script {chk_haproxy}
}
EOF配置 haproxy 健康检测脚本 所有 keepalived 节点都需要配置 因为非抢占模式所以需要手动切换 VIP这里脚本用停止 keepalived 服务来触发手动切换 VIP脚本里面是探测 haproxy 的端口三次如果返回状态码都是非0就会触发停止 keepalived 服务 cat EOF /data/script/chk_haproxy.sh
#!/bin/bash
exitNum0while true
doif ! nc -z 127.0.0.1 13307; thenlet exitNum[ ${exitNum} -lt 3 ] || systemctl stop keepalivedfi
done
EOFkeepalived 的健康检测脚本必须要有执行权限 chmod x /data/script/chk_haproxy.sh启动 keepalived 服务 注意启动顺序要先启动一个 keepalived 组件并且有 VIP 了之后再去启动剩下的 keepalived 组件如果同时启动 keepalived 组件那就都会有 VIP 地址了 systemctl enable keepalived
systemctl start keepalived验证 VIP 登录 mysql 能读取到数据证明 keepalived 部署没有问题 mysql -uvinci -pDavVinci -h172.72.0.100 -P13307 -e SELECT music_name FROM music.favorite WHERE nameHacken Lee limit 1;验证高可用是否有效
当一台 mysql 服务无进程 杀掉一个 mysql 的进程模拟 mysql 出现故障等 30秒后看是否能写入 mysql 数据 杀掉一个 mysql 的进程后可以从 haproxy 的统计页面看到显示为 down cat /data/mysql/mysqld.pid | xargs kill -9 \
sleep 30 \
mysql -uvinci -pDavVinci -h172.72.0.100 -P13307 -e INSERT INTO music.favorite(name, music_name) VALUES (Beyond,冷雨夜);验证完成后再次启动 mysql在 haproxy 的统计页面看到显示为 up并且进入 mysql 查看 SHOW SLAVE STATUS 确认 Slave_IO_Running 和 Slave_SQL_Running 都是 YES 验证 keepalived 是否为非抢占模式 存在 VIP 的节点停止 keepalived 服务模拟 keepalived 故障看 VIP 是否会漂移到其他节点 systemctl stop keepalived此时去其他节点发现 VIP 已经漂移过来了并且可以读取 mysql 数据 将停止的 keepalived 重新启动看 VIP 是否会漂移回来 正常情况下处于非抢占模式VIP 是不会再次漂移的
systemctl start keepalived当一台 haproxy 服务无进程mysql 服务均正常 这里直接把有 VIP 节点的 haproxy 服务停止模拟 haproxy 故障并且触发 keepalived 的健康检测进行 VIP 的漂移同时验证是否能读取 mysql 数据 systemctl stop haproxy \
sleep 10 \
ip a | grep 172.72.0.100; \
mysql -uvinci -pDavVinci -h172.72.0.100 -P13307 -e SELECT music_name FROM music.favorite WHERE nameHacken Lee limit 1;使用 tcpdump 命令观察地址的变化 tcpdump -i ens160 vrrp -nn可以看到VIP 从 172.72.0.116 机器切换到 172.72.0.137 机器上并且也能正常读取 mysql 的数据 22:25:19.569090 IP 172.72.0.116 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 98, authtype simple, intvl 1s, length 20
22:25:20.569328 IP 172.72.0.116 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 98, authtype simple, intvl 1s, length 20
22:25:21.570001 IP 172.72.0.116 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 98, authtype simple, intvl 1s, length 20
22:25:21.578036 IP 172.72.0.116 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 0, authtype simple, intvl 1s, length 20
22:25:22.196273 IP 172.72.0.137 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 98, authtype simple, intvl 1s, length 20
22:25:23.196572 IP 172.72.0.137 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 98, authtype simple, intvl 1s, length 20
22:25:24.196795 IP 172.72.0.137 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 98, authtype simple, intvl 1s, length 20基于二进制部署的 mysql 写了一个脚本来做启停和重启
#!/usr/bin/env bash
baseDir$(cd dirname $0;pwd)
envName$1
envOpt$2
pidFile/data/mysql/mysqld.pid
MYSQL_HOME/data/software/mysql-5.7.29-linux-glibc2.12-x86_64function opt_usage () {echo usage: bash $0 start|stop|restartexit 1
}if [ $# -lt 1 ];thenopt_usageexit 1
fifunction start_mysql () {if [[ ! -f ${pidFile} ]];then${MYSQL_HOME}/bin/mysqld \--defaults-file/data/mysql/config/my.cnf --daemonize \--plugin-dir${MYSQL_HOME}/lib/pluginif [ $? -eq 0 ];thenecho mysql start successfielsepidNum$(ps -ef | grep -v grep | grep mysqld | awk {print $2})echo pid: ${pidNum} is running for mysqld,please check itexit 1fi
}function stop_mysql () {if [[ ! -f ${pidFile} ]];thenecho pid file: ${pidFile} is not foundexit 1elsekill $(cat ${pidFile})sleep 5num0while truedops -ef | grep -v grep | grep mysqld | awk {print $2} /dev/nullif [ $? -eq 0 ];thenecho stop mysql successbreakelseecho wating for mysql shutdown......let numsleep 1fiif [ ${num} -eq 3 ];thenecho stop mysql failed,please check itexit 1fidonefi
}function status_mysql () {if [ -f ${pidFile} ];thenpidNum$(ps -ef | grep -v grep | grep mysqld | awk {print $2})if [ ${pidNum} -eq $(cat ${pidFile}) ];thenecho mysql is runningecho mysql version is: $(mysql -V)echo mysql pid is: ${pidNum}fielseecho mysql is not runningfi
}case $1 instart)start_mysql;;stop)stop_mysql;;restart)stop_mysqlstart_mysql;;status)status_mysql;;*)opt_usageexit 1
esac