话不多说,直接开搞
ip | 服务 |
172.72.0.116 | keepalived+haproxy+mysql |
172.72.0.137 | keepalived+haproxy+mysql |
172.72.0.100 | VIP |
部署前,大家先要确认集群之间的时间是否一致,集群类的服务,最怕时间不一致
部署 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 found libstdc++.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 port=13306 # MySQL 在运行时需要 errmsg.sys 文件来显示和报告错误消息 lc-messages-dir=/data/software/mysql-5.7.29-linux-glibc2.12-x86_64/share/english server_id=116 # binlog # binlog 文件的名称 log_bin=mysql-bin # 设置每个二进制日志文件的最大大小 max_binlog_size=100m # 设置用于缓存二进制日志事件的缓冲区大小 binlog_cache_size=4m # 设置 binlog 缓存的最大大小 max_binlog_cache_size=512m # binlog 类型 binlog_format=MIXED # binlog 过期时间 expire_logs_days=7 bind-address=0.0.0.0 # 是否允许在数据库目录下使用符号链接 ## symbolic-links=0:表示不允许使用符号链接。如果设置为 0,MySQL 服务器在启动时将不会使用数据库目录下的符号链接,并且可能会在符号链接存在时报错。 ## symbolic-links=1:表示允许使用符号链接。如果设置为 1,MySQL 服务器在启动时将允许使用数据库目录下的符号链接,但仅限于特定目录或文件(根据权限设置)。 ## symbolic-links=2:表示允许使用符号链接,且没有限制。如果设置为 2,MySQL 服务器在启动时将允许使用数据库目录下的任意符号链接,包括对任意文件或目录的链接。 symbolic-links=0 # mysql 最大连接数 max_connections=1000 # 默认存储引擎 default_storage_engine=innodb # 禁用外部锁定,MySQL 将使用内部锁定来代替外部锁定 skip_external_locking # 0:表名存储为原始大小写,区分大小写; # 1:表名存储为小写,不区分大小写; # 2:表名存储为小写,但会在文件系统上进行名称比较,因此会区分大小写。 lower_case_table_names=1 # 禁用主机缓存,每次都要重新解析域名 skip_host_cache # 开启主机名解析 skip_name_resolve # 设置服务器的默认字符集 character_set_server=utf8 # 客户端与服务器之间允许的最大数据包大小 max_allowed_packet=12M # 控制 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_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' [client] # 设置 MySQL 客户端连接的默认字符集 character-set-client=utf8 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 port=13306 # MySQL 在运行时需要 errmsg.sys 文件来显示和报告错误消息 lc-messages-dir=/data/software/mysql-5.7.29-linux-glibc2.12-x86_64/share/english server_id=137 # binlog # binlog 文件的名称 log_bin=mysql-bin # 设置每个二进制日志文件的最大大小 max_binlog_size=100m # 设置用于缓存二进制日志事件的缓冲区大小 binlog_cache_size=4m # 设置 binlog 缓存的最大大小 max_binlog_cache_size=512m # binlog 类型 binlog_format=MIXED # binlog 过期时间 expire_logs_days=7 bind-address=0.0.0.0 # 是否允许在数据库目录下使用符号链接 ## symbolic-links=0:表示不允许使用符号链接。如果设置为 0,MySQL 服务器在启动时将不会使用数据库目录下的符号链接,并且可能会在符号链接存在时报错。 ## symbolic-links=1:表示允许使用符号链接。如果设置为 1,MySQL 服务器在启动时将允许使用数据库目录下的符号链接,但仅限于特定目录或文件(根据权限设置)。 ## symbolic-links=2:表示允许使用符号链接,且没有限制。如果设置为 2,MySQL 服务器在启动时将允许使用数据库目录下的任意符号链接,包括对任意文件或目录的链接。 symbolic-links=0 # mysql 最大连接数 max_connections=1000 # 默认存储引擎 default_storage_engine=innodb # 禁用外部锁定,MySQL 将使用内部锁定来代替外部锁定 skip_external_locking # 0:表名存储为原始大小写,区分大小写; # 1:表名存储为小写,不区分大小写; # 2:表名存储为小写,但会在文件系统上进行名称比较,因此会区分大小写。 lower_case_table_names=1 # 禁用主机缓存,每次都要重新解析域名 skip_host_cache # 开启主机名解析 skip_name_resolve # 设置服务器的默认字符集 character_set_server=utf8 # 客户端与服务器之间允许的最大数据包大小 max_allowed_packet=12M # 控制 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_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' [client] # 设置 MySQL 客户端连接的默认字符集 character-set-client=utf8 EOF
mysql 初始化
mysqld --initialize-insecure \ --user=mysql \ --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 root@localhost = 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.000001 Position: 841 Binlog_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_HOST='172.72.0.116', MASTER_PORT=13306, MASTER_USER='rpldb', MASTER_PASSWORD='cnBsZGIwMDcK', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=841;
启动复制
STOP SLAVE; START SLAVE;
查看复制是否成功
SHOW SLAVE STATUS\G
看到这两个都是 yes,表示主从复制已经建立成功了
Slave_IO_Running: Yes Slave_SQL_Running: Yes
172.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.000001 Position: 841 Binlog_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_HOST='172.72.0.137', MASTER_PORT=13306, MASTER_USER='rpldb', MASTER_PASSWORD='cnBsZGIwMDcK', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=841;
启动复制
STOP SLAVE; START SLAVE;
查看复制是否成功
SHOW SLAVE STATUS\G
看到这两个都是 yes,表示主从复制已经建立成功了
Slave_IO_Running: Yes Slave_SQL_Running: Yes