写点什么

什么?你们项目没用过主从复制和读写分离?

用户头像
Java 白
关注
发布于: 1 小时前

温馨提示:大概需要半小时到一小时安装成功。

目录

1、Master 库搭建(主库搭建和从库搭建一毛一样)

2、Slave 库搭建(参考主库搭建 ↑)

3、绑定主从关系(这一步主要是修改一些配置文件)

1.初始化一个 SpringBoot 工程,并添加 Sharding-jdbc 依赖

提示:随着项目数据量的增大,我们不得不开始考虑主从复制和读写分离。

一、主从复制搭建

1、Master 库搭建(主库搭建和从库搭建一毛一样)

这里我只准备了一台服务器进行搭建测试,遂主库和从库均在一台服务器上,只不过是访问端口不一样而已

第一步:检查用户组

cat /etc/group | grep mysqlcat /etc/passwd |grep mysql#没有任何输出,说明没有则创建该用户组#若存在mysql用户组,可以执行删除指令userdel mysql#创建用户组groupadd mysqluseradd -r -g mysql mysql
复制代码

第二步:下载 mysql 包

这边提供了永久网盘资源,失效评论区找我,我会第一时间提供。我们下面的安装均使用该版本进行安装。
链接:https://pan.baidu.com/s/1nlCjsIPmKH3PQhU8g9MVGw 提取码:3mcg
复制代码

使用 xftp 软件上传至服务器


#解压tar xzvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
复制代码

第三步:创建存储数据目录并赋权

mkdir /usr/local/mysql/datachown -R mysql:mysql /usr/local/mysqlchmod -R 755 /usr/local/mysql
复制代码

目录切换到/home/mysql 下,所有解压文件移动到 usr/local/mysql 下面

mv mysql-5.7.24-linux-glibc2.12-x86_64 /usr/local/mysql
复制代码

第四步 编辑 my.cnf,做一些简单配置

basedir=/usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0
log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid#跳过密码验证skip-grant-tablesserver-id=2log-bin=mysql-bin
[mysqld]datadir=/usr/local/mysql/dataport = 3306sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLESsymbolic-links=0max_connections=400innodb_file_per_table=1#表名大小写不明感,敏感为lower_case_table_names=1
复制代码

第五步启动服务

/usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/support-files/mysql.server start
#执行该命令,可能会报如下错误,大多是由于权限问题,找到mysql的文件进行赋权即可(不报错直接命令行登录测试,然后跳到第六步)
[root@VM-0-10-centos mysql]# /usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/support-files/mysql.server startStarting MySQL............ ERROR! The server quit without updating PID file (/var/run/mysqld/mysqld.pid).
复制代码

这边我们提供一个解决方案的链接: 解決方案鏈接

还可能会出现:

#还可能会出现Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2) ";
复制代码

这边提供另一个解决方案: 解决方案链接

重启服务:

[root@VM-0-10-centos bin]# /usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/support-files/mysql.server startStarting MySQL SUCCESS! 

#测试下命令行登录[root@VM-0-10-centos bin]# mysql -u root -pEnter password:#到这一步直接回车,不比输入密码,因为刚才已经跳过密码验证了
MySQL [(none)]> exit;Bye[root@VM-0-10-centos bin]#
复制代码

第五步添加软连接,方便重启

ln -s /usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/bin/mysql /usr/bin/mysqlln -s /usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/bin/mysql /usr/bin/mysql

#添加完软连接就可以在任意目录下愉快地重启了[root@VM-0-10-centos bin]# service mysql restartShutting down MySQL.... SUCCESS! Starting MySQL.......... SUCCESS!
复制代码

第七步:登录 mysql,修改密码

#编辑my.cnfvim /etc/my.cnf#注释掉
#skip-grant-tables
#重启mysqlservice mysql restart

mysql -u root -pmysql> use mysql;#使用数据库mysql> set password for root@localhost = password('mysql123');#修改数据库密码为mysql123mysql> update user set user.Host='%' where user.User='root';#开放远程连接mysql>flush privileges;
复制代码

第七步:设置开机启动

1、将服务文件拷贝到init.d下,并重命名为mysql[root@localhost /]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld2、赋予可执行权限[root@localhost /]# chmod +x /etc/init.d/mysqld3、添加服务[root@localhost /]# chkconfig --add mysqld
复制代码

验证 navicat 远程连接


2、Slave 库搭建(参考主库搭建 ↑ )

3、绑定主从关系(这一步主要是修改一些配置文件)

(1)开启 master 的二进制日志

①配置 my.cnf 配置文件

vi /etc/my.cnf
复制代码

②添加二进制日志配置,开启二进制(mysql-bin 只是二进制日志名称,可以自行指定)

server-id=1             #id是一定要指定的,是唯一的标识(master数据库要比slave数据库的id优先级高才行)log-bin=mysql-bin       #开启二进制日志
复制代码

③授权 :登录数据库,需要给 slave 数据库配置一个用户/密码的权限

(允许某个 ip 地址的某个用户以某个密码对当前数据库的所有库和表进行复制操作配置之后需要刷新权限)

mysql> grant replication slave on *.* to 'root'@'slave数据库ip' identified by '密码';
复制代码


mysql> flush privileges;
复制代码

④修改完重启服务,查询 master 状态

[root@VM_0_10_centos ~]# service mysqld restart
复制代码

登录数据库,查询 master 状态,如下图所示:

mysql> show master status;
复制代码



file:是日志文件名称

position:日志所在位置

(2) 开启 slave 的二进制日志

①修改 my.cnf

vi /etc/my.cnf
复制代码

添加 slave 二进制日志配置,开启二进制(mysql-bin 只是二进制日志名称,可以自行指定)

server-id=2log-bin=mysql-bin
复制代码

注意:每一台指定唯一的一个 server-id 标识

修改完配置服务需重启服务

[root@VM_0_16_centos ~]# service mysqld restart
复制代码

②配置 slave 指向 master,登录数据库

mysql> change master to master_host='10.0.33.18',master_port=3306,master_user='root',master_password='mysql123',master_log_file='mysql-bin.000002',master_log_pos=154;
mysql>flush privileges;
mysql>start slave;
mysql> show slave status\G;
*************************** 1. row *************************** Slave_IO_State: Master_Host: 10.0.3x.xx Master_User: root Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 154 Relay_Log_File: localhost-relay-bin.000002 Relay_Log_Pos: 4 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: YES Slave_SQL_Running: YES Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 154 Relay_Log_Space: 154 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULLMaster_SSL_Verify_Server_Cert: No Last_IO_Errno: 2003 Last_IO_Error: error connecting to master 'root@10.0.33.18:3306' - retry-time: 60 retries: 9 Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0 Master_UUID: Master_Info_File: /usr/local/mysql/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: 210419 15:17:11 Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec)
复制代码

主要看这俩进程是否 YES:


OK,主从复制配置文件到此修改完成。

提示:若主从挂调,可以优先在这里查看报错信息。


4、测试主从复制效果



二、读写分离配置

1.初始化一个 SpringBoot 工程,并添加 Sharding-jdbc 依赖

数据源配置代码如下:

sharding.jdbc.datasource.names=master,slave
# 主数据源sharding.jdbc.datasource.master.type=com.alibaba.druid.pool.DruidDataSourcesharding.jdbc.datasource.master.driver-class-name=com.mysql.jdbc.Driversharding.jdbc.datasource.master.url=jdbc:mysql://10.0.33.18:3308/sharding?useUnicode=true&characterEncoding=utf-8&useSSL=falsesharding.jdbc.datasource.master.username=rootsharding.jdbc.datasource.master.password=mysql123
# 从数据源sharding.jdbc.datasource.slave.type=com.alibaba.druid.pool.DruidDataSourcesharding.jdbc.datasource.slave.driver-class-name=com.mysql.jdbc.Driversharding.jdbc.datasource.slave.url=jdbc:mysql://10.0.33.19:3306/sharding?useUnicode=true&characterEncoding=utf-8&useSSL=falsesharding.jdbc.datasource.slave.username=rootsharding.jdbc.datasource.slave.password=mysql123
# 读写分离配置sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robinsharding.jdbc.config.masterslave.name=dataSourcesharding.jdbc.config.masterslave.master-data-source-name=mastersharding.jdbc.config.masterslave.slave-data-source-names=slave
复制代码

2.测试读写分离效果

如下,在 mysql-master 容器中,查看 sql 日志,可以看到插入的 sql 在主数据库执行:


如下,查看 mysql-slave 的 sql 日志,读取列表数据再从数据库执行,说明我们配置的读写分离是成功的。


原文链接:http://www.cnblogs.com/dk1024/p/14703463.html

用户头像

Java 白

关注

还未添加个人签名 2021.06.21 加入

Java使我秃头

评论

发布
暂无评论
什么?你们项目没用过主从复制和读写分离?