有很多公司的网站存在大量的并发访问,一般的解决方式就是利用MySQL主从配置,实现读写分离,减轻数据库压力,今天就记录一下,这几次搭建主从的一些心得
什么是MySQL主从复制
简单来说就是保证主SQL(Master)和从SQL(Slave)的数据是一致性的,向Master插入数据后,Slave会自动从Master把修改的数据同步过来(有一定的延迟),通过这种方式来保证数据的一致性,就是主从复制
- 第一步当然是安装MySQL,数据库版本要一致,减少出现不可预支的问题
- 配置Master主服务器
在Master MySQL上创建一个用户“slave”,并允许其他Slave服务器可以通过远程访问Master,通过该用户读取二进制日志,实现数据同步。
mysql>create user slave; //创建新用户
//repl用户必须具有REPLICATION SLAVE权限,除此之外没有必要添加不必要的权限,密码为mysql。说明一下192.168.0.%,这个配置是指明repl用户所在服务器,这里%是通配符,表示192.168.0.0-192.168.0.255的Server都可以以repl用户登陆主服务器。当然你也可以指定固定Ip。
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.0.%' IDENTIFIED BY 'mysql';
刷新一下权限 flush privileges;
找到MySQL安装文件夹修改my.ini文件。mysql中有好几种日志方式,这不是今天的重点。我们只要启动二进制日志log-bin就ok。
在[mysqld]下面增加下面几行代码
server-id=1 #给数据库服务的唯一标识,一般为大家设置服务器Ip的末尾号,如果从数据库也设置这个参数的话,一定不能相同,随便给个数字就可以了
log-bin=master-bin
log-bin-index=master-bin.index #开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
## 复制过滤:需要备份的数据库,输出binlog
#binlog-do-db=roncoo
## 复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
binlog-ignore-db=mysql
查看日志
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000008 | 120 | | | |
+------------------+----------+--------------+------------------+-------------------+
重启MySQL服务
4. Slave从服务器(centos)
(1)找到MySQL安装文件夹修改my.cnf文件,vim my.cnf
server-id= 101 #不可跟其他主从数据库相同
log-bin=edu-mysql-slave1-bin # 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
relay-log=mysql-relay-bin #relay_log配置中继日志
log-slave-updates=1
read-only=1 #设定之后就是只读数据库了,只有super权限的用户可以读写
replicate-wild-do-table=db.% #过滤掉不需要同步的数据库,只同步db数据库,这个最好在从库过滤
slave-skip-errors = 1133 #同步过程中忽略的错误码
(2) 重启数据库 service mysql restart;
(3)连接Master
change master to master_host='192.168.0.?', //指定主服务器IP地址
master_port=3306,
master_user='slave', //指定在主服务器上可以进行同步的用户名
master_password='mysql', //指定在主服务器上可以进行同步的用户名的密码
master_log_file='master-bin.000001', //Master服务器产生的日志,必须跟主数据库的file字段一致
master_log_pos=0 //必须跟主数据库的Position一致
(4)启动Slave
start slave;
查看状态 show slave status;
mysql 1236错误