准备两台以上机器;
1. 安装mysql
下载mysql
方法一:本地上传
方法二:linux下载
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz
cd /usr/local/
# 下载
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz
# 解压
tar xvJf mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz
# 改名
mv mysql-8.0.30-linux-glibc2.12-x86_64 mysql
cd mysql/
# 新建文件,如存在忽略
mkdir data
mkdir log
# 新建pid文件
touch mysql.pid
# 新增mysql用户组和用户
groupadd mysql
useradd -g mysql mysql
# 权限设置
chown -R mysql.mysql /usr/local/mysql
# 新建配置文件(配置参考拉到最后)
vim /etc/my.cnf
cd mysql/bin/
# 初始化
./mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize
在错误日志文件找出你的临时密码
vim /usr/local/mysql/log/mysql.err
# 复制引用
cp -a ../support-files/mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql
chkconfig --add mysql
# 创建软链接
ln -s /usr/local/mysql/bin/mysql /usr/bin/
service mysql start
mysql -uroot -p
(安装成功)
从库机器重复安装步骤(略)
2 半同步复制配置
2.1 主库和从库 半同步复制配置
# 启动mysql
service mysql start
# 登录
mysql -uroot -p
# 主库安装插件 (预防主从切换建议两个都安装)
mysql>install plugin rpl_semi_sync_master soname 'semisync_master.so';
# 从库安装插件
mysql>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
# 如若需要删除
mysql>uninstall plugin rpl_semi_sync_master;
查看插件是否成功安装
mysql>show status like '%semi%';
mysql>show global variables like 'rpl_semi%';
如果Rpl_semi_sync_master_status值为OFF, rpl_semi_sync_master_enabled为ON,并且从库能同步数据成功,说明仍然是异步复制,可能是my.cnf配置文件修改未重启mysql导致的;只需要重启mysql可以得到解决。
安装完插件后可以把/etc/my.cnf注释的同步配置放开(主库,从库)
2.2 主库 半同步复制配置
# 重启mysql 使配置生效
service mysql restart
# 新建账户用于主从同步 不建议用root同步;
-- CREATE USER 'slave'@'%' IDENTIFIED BY '密码'; --mysql8.0默认采用caching_sha2_password 身份验证机制会导致连接失败,别用
# mysql8.0需要采用以下语句创建
mysql>CREATE USER 'slave'@'%' IDENTIFIED WITH 'mysql_native_password' BY '密码';
# 赋值权限
mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
# 使账户生效
mysql>flush privileges;
# 查看binlog状态
mysql>show master status\G;
mysql>show master status;
# 监控同步状态
mysql>show global status like 'rpl%';
记录下:File, Position并不要向数据库做任何写操作,从库数据同步需要
2.3 从库半同步复制配置
# 暂停同步数据 预防出错
mysql>stop slave;
# master_connect_retry 表示重连的时间间隔
# 若主从在同一内网,使用内网ip
mysql>change master to master_host='192.168.*.*', master_user='slave', master_password='slave的密码', master_port=3306, master_log_file='mysql-bin.000004', master_log_pos=1016, master_connect_retry=30;
把my.cnf注释放开
# 重启mysql
service mysql restart
# 登录
mysql -uroot -p
# 启动同步
mysql>start slave;
# 查看状态
mysql>SHOW SLAVE STATUS \G
Slave_IO_Running,Slave_SQL_Running 均为yes 代表同步成功
注意因半同步复制需要依赖插件rpl_semi实现,未安装插件前 不要打开注释启动mysql;
3./etc/my.cnf 配置参考
3.1my.cnf 主库配置
#基础配置#
[client]
port=3306
socket=/usr/local/mysql/mysql.sock
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock #路径需要有mysql用户权限 建议直接在mysql目录
character-set-server=UTF8MB4
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #mysql8.0适配5.7语法
#优化配置#
max_connections=100 # 最大连接数 实际连接数是最大连接数的85%比较合适 一般网站调整到 1000 左右
innodb_thread_concurrency=8 # 默认值为0表示不限制,一般是CPU核数相同或核数的2倍 建议 8
innodb_buffer_pool_size=2048M # 物理内存的70%~80% 默认128M
max_allowed_packet=128M #SQL数据包发送的大小最大值是1GB,必须设置1024的倍数
#主从配置#
server-id=154 #id唯一,一般采用机器ip后缀
#replicate-wild-ignore-table=mysql.* # 忽略表
#replicate-wild-ignore-table=sys.* # 忽略表
#半同步复制#
#rpl_semi_sync_master_enabled=1 #表示在master上已经开启了半同步复制模式(主库)
#rpl_semi_sync_master_timeout=5000 #表示如果主库在某次事务中的等待时间超过5000毫秒,则降级为异步复制模式,不在等待slave从库。如果主库再次探测到slave从恢复了,则会自动切换回半同步复制模式
#主库必须,从库不必须#
#log-bin=mysql-bin #bin-log日志路径, 路径相对于 datadir
#binlog_cache_size=2M #为每个session 分配的内存,如果事务大而且多,dml操作也频繁(2–4M)
#log_slave_updates=1 #表示slave将复制事件写进自己的二进制日志
#binlog_format=mixed #数据混合复制同步
#expire_logs_days=15 #超过天数删除binlog日志
#sync_binlog=1 #默认0:让filesystem自行决定什么时候来同步,或者cache满了之后再同步
#sync_binlog 1:事物提交会把BINLOG刷新到磁盘,很大的影响MySQL和IO性能,0和设置为1的系统写入性能差距可能高达5倍甚至更多;
#慢查询配置#
slow_query_log=1 #开启慢查询
long-query-time=3 #慢查询的阀值 单位秒
slow_query_log_file=/usr/local/mysql/log/slow.log
[mysqld_safe]
pid-file=/usr/local/mysqld/mysqld.pid #路径需要有mysql用户权限 建议直接在mysql目录
log-error=/usr/local/mysql/log/mysql.err
3.2my.cnf 从库配置
#基础配置#
[client]
port=3306
socket=/usr/local/mysql/mysql.sock
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock # 路径需要有mysql用户权限 建议直接在mysql目录
character-set-server=UTF8MB4
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #mysql8.0适配5.7语法
super_read_only=1 # 从库只读(包括拥有超级权限)
#优化配置#
max_connections=100 # 最大连接数 实际连接数是最大连接数的85%比较合适 一般网站调整到 1000 左右
innodb_thread_concurrency=8 # 默认值为0表示不限制,一般是CPU核数相同或核数的2倍 建议 8
innodb_buffer_pool_size=2048M # 物理内存的70%~80% 默认128M
max_allowed_packet=128M #SQL数据包发送的大小最大值是1GB,必须设置1024的倍数
#主从配置#
server-id=154 #id唯一,一般采用机器ip后缀
#replicate-wild-ignore-table=mysql.* # 忽略表
#replicate-wild-ignore-table=sys.* # 忽略表
#半同步复制#
#rpl-semi-sync-slave-enabled=1 #表示slave开启半同步复制模式(从库)
#慢查询配置#
slow_query_log=1 #开启慢查询
long-query-time=3 #慢查询的阀值 单位秒
slow_query_log_file=/usr/local/mysql/log/slow.log
[mysqld_safe]
pid-file=/usr/local/mysql/mysqld.pid #路径需要在mysql目录 否则启动异常
log-error=/usr/local/mysql/log/mysql.err
如有疑问或错误请指出,谢谢
看到这里点个赞吧