...
分类: LINUX
2012-03-09 15:25:07
一主多从,读写分离(在master写,在master和slave上读),提高mysql的读效率。
NBD集群:读写都会提升,国内很少用;
架构:
master–>slave1–>slave2
Mysql集群有:
MySQL复制
MYSQL读写分离
MySQl NDB Cluster
MySQL复制 :
master服务器:接受读/写请求。他的数据更新都会被从服务器所接受。打开一个线程,用于等待从服务器的连接,连接成功之后,用于数据传输,传输的数据就是主服务的二进制日志记录。
slave服务器:
仅仅读的请求。他的数据更新都是根据从主服务器上获得信息进行更新。它会打开两个线程:SQL_THREAD, IO_THREAD。
IO_THREAD 负责连接主服务器,把相关更新下载回来,放到relay-binlog文件
SQL_THREAD 执行下载回来的更新操作,执行后删除relay-binlog中的内容。
主从作用:
1.提升读的能力
2.备份的功能
3.提供容错的备份(延迟复制)
主从配置要求:
1.启动二进制日志
2.设置service-id
1.主机的初始化配置:
配置好IP地址和主机名
master:
hostname master.yaukb.com
IP 192.168.1.10
slave1:
hostname slave1.yaukb.com
IP 192.168.1.11
slave2:
hostname slave2.yaukb.com
IP 192.168.1.12
slave3:
hostname slave1.yaukb.com
IP 192.168.1.13
修改/etc/hosts文件
在master上操作:
# vim /etc/hosts
192.168.1.10 master.yaukb.com master
192.168.1.11 slave1.yaukb.com slave1
192.168.1.12 slave2.yaukb.com slave2
192.168.1.13 slave3.yaukb.com slave3
将hosts文件复制到从服务器上:
# scp /etc/hosts slave1:/etc
# scp /etc/hosts slave2:/etc
# scp /etc/hosts slave3:/etc
或:
# rsync -avzR /etc/hosts slave1:/ –R保持原文件的路径位置,所以不用输入slave:/etc
使用源码部署时,当安装一台后,可以使用rsync进行同步,这样才能保持原文件的权限和目录位置;
2.mysql服务器的安装与初始化配置:
上传软件到四台机器上,并分别安装相同版本的mysql软件:如软件版本不同,做集群会有问题。
本试验使用rpm包,部署快点,生产环境都建议使用源码。
# scp MySQL-* slave1:/root
# scp MySQL-* slave2:/root
# scp MySQL-* slave3:/root
# rpm -ivh MySQL-client-5.5.8-1.rhel5.i386.rpm MySQL-server-5.5.8-1.rhel5.i386.rpm
3.配置主服务器(master)
pid标识mysql是否存活。
日志和数据分开有以下好处:
1.备份;
2.提高读写性能;
3.故障隔离,使用不同的挂载分区进行日志和数据的存储;
3.1 定义my.cnf文件
# mysqld_safe –verbose –help –查询参数
# vim /etc/my.cnf
[client]
socket = /dblog/mysqld.sock
port = 3306
[mysqld]
socket = /dblog/mysqld.sock –服务运行的时候会开启一个socket接口供本地客户端连接
port = 3306
pid-file = /dblog/mysqld.pid
datadir = /data –数据目录
default-storage-engine=innodb –默认的存储引擎,现在Mysql的主打存储引擎
innodb_data_home_dir =/data –innodb的数据家目录
innodb_data_file_path =ibdata1:50M:autoextend –innodb的数据存储文件,当写绝对路径时,innodb_data_home_dir要为空,这样可以指定多个存储文件,使用分号隔开
server-id = 1 –mysql服务器的id号:(1-2^32),id号越小优先级越高
log-bin = /dblog/mysqld-bin –二进制日志
max-binlog-size = 10M –mysqlbinlog的单个文件最大是10M
expire_logs_days = 10 –日志最大存储日期
#logs
slow_query_log = /dblog/slow.log –慢日志,在生产环境一定要记得开启
long_query_time = 1 –定义超过一秒的查询属于慢查询
log-error = /dblog/mysqld.err –错误日志
查询日志不要开,因数据大,影响I/O,排错才使用。
log-bin:每次重启Mysql都会产生一个新的文件
# mkdir /data –建立数据存放目录
# mkdir /dblog –建立日志存放目录
# chmod 700 /data/ /dblog –修改权限
# chown mysql.mysql /data /dblog/ -R
# mysql_install_db –datadir=/data –user=mysql –进行初始化
# service mysql start –启动服务,如出现找不到PID,请检查selinux,iptables是否开启
# chkconfig mysql on
3.2 初始化配置:
安装完成后在主服务器上作初始化的相关配置:
mysql> delete from mysql.user where user=''; --删除匿名账号
Query OK, 2 rows affected (0.01 sec)
mysql> update mysql.user set password=password('123'); --给默认管理员设置密码
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0
mysql> flush privileges; --更改密码后刷新权限表
Query OK, 0 rows affected (0.00 sec)
创建测试表和测试库:
mysql> create database test default charset utf8;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
mysql> create table t1(id int);
Query OK, 0 rows affected (0.46 sec)
mysql> insert into t1 set id=1;
Query OK, 1 row affected (0.59 sec)
4.实现一主多从
a.在主服务器上配置:
# vim /etc/my.cnf
server-id = 1
log-bin = /dblog/mysqld-bin --确认这两项都存在,因为是做主从的必要条件
b.创建从服务器同步binlog的账号:
mysql> grant replication slave,super,reload on *.* to slave@'%' identified by '123';
Query OK, 0 rows affected (0.05 sec)
如果你计划从从属服务器主机使用LOAD TABLE FROM MASTER或LOAD DATA FROM MASTER语句,你需要授予该账户其它权限:授予账户SUPER和RELOAD全局权限。
c.备份主服务器上的数据至从服务器上:
# mysqldump -uroot -p123 –master-data=2 –all-databases > /tmp/all.sql –master-data=2将当前的log_file和pos记录到备份文件中
# vim /tmp/all.sql
– CHANGE MASTER TO MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=1366; --记住这一行
# scp /tmp/all.sql slave1:/tmp
d.在slave1的配置:
# vim /etc/my.cnf
[client]
socket = /dblog/mysqld.sock
port = 3306
[mysqld]
socket = /dblog/mysqld.sock
port = 3306
pid-file = /dblog/mysqld.pid
datadir = /data
default-storage-engine=innodb
innodb_data_home_dir = /data
innodb_data_file_path =ibdata1:50M:autoextend
server-id = 2
log-bin = /dblog/mysqld-bin
max-binlog-size = 10M
log-slave-updates –同步更新binlog至本机的binlog日志文件中,不然将不能将master的记录同步到slave2
#logs
slow_query_log = /dblog/slow.log
long_query_time = 1
log-error = /dblog/mysqld.err
# mkdir /data
# mkdir /dblog
# chmod 700 /data/ /dblog
# chown mysql.mysql /data /dblog/ -R
# mysql_install_db –datadir=/data –user=mysql
# service mysql start
# chkconfig mysql on
e.导入数据,设置成为从服务器
# mysql < /tmp/all.sql
# mysql
mysql> flush privileges;
mysql> change master to
-> MASTER_HOST='192.168.1.10',
-> MASTER_USER='slave',
-> MASTER_PASSWORD='123',
-> MASTER_LOG_FILE='mysqld-bin.000005', –根据你自己的实际情况定义
-> MASTER_LOG_POS= 1366, –根据你自己的实际情况定义(vim /tmp/all.sql查看)
-> MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.02 sec)
mysql>start slave;
mysql> start slave;
ERROR 1200 (HY000): The server is not configured as slave; fix in config file or with CHANGE MASTER TO —>因service-id没有设置
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Connecting to master
Master_Host: 192.168.80.137
Master_User: slave
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysqld.000004
Read_Master_Log_Pos: 505670
Relay_Log_File: mysqld-relay-bin.000003
Relay_Log_Pos: 98
Relay_Master_Log_File: mysqld.000004
Slave_IO_Running: No
Slave_SQL_Running: Yes
change master to命令的使用可以使用:? change master to进行查看
参数的限制值:不能超过以下标注的字符长度
Master_Host 60
Master_USER 16
Master_PASSWORD 32
Master_Log_File 255
通常情况,从服务器从主服务器接收到的更新不记入它的二进制日志。logs-slave-updates该选项告诉从服务器将其SQL线程执行的 更新记入到从服务器自己的二进制日志。为了使该选项生效,还必须用–logs-bin选项启动从服务器以启用二进制日志。如果想要应用链式复制服务器,应 使用–logs-slave-updates。例如,可能你想要这样设置:A -> B -> C
也就是说,A为从服务器B的主服务器,B为从服务器C的主服务器。为了能工作,B必须既为主服务器又为从服务器。你必须用–logs-bin启用二进制日志,并且用–logs-slave-updates选项将更新记录写入二进制日志。
验证:
从服务器上执行:
mysql> show slave status \G; –看到下面两行说明slave已经启动
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Read_Master_Log_Pos: 1762 –如同步成功,那两个数值应该要相同
Exec_Master_Log_Pos: 1762
主服务器上执行:
mysql> show processlist;
f.把slave2变成slave1的从服务器:
在slave1上执行备份:
# mysqldump -uroot -p123 –master-data=2 –all-databases > /tmp/all.sql
# scp /tmp/all.sql slave2:/tmp
在slave2上配置:
# vim /etc/my.cnf
[client]
socket = /dblog/mysqld.sock
port = 3306
[mysqld]
socket = /dblog/mysqld.sock
port = 3306
pid-file = /dblog/mysqld.pid
datadir = /data
default-storage-engine=innodb
innodb_data_home_dir = /data
innodb_data_file_path =ibdata1:50M:autoextend
server-id = 3
#log-bin = /dblog/mysqld-bin –因不需要作为其他服务器的主,可以不用启用日志,以减少I/O,提高性能
#max-binlog-size = 10M
#log-slave-updates
#logs
slow_query_log = /dblog/slow.log
long_query_time = 1
log-error = /dblog/mysqld.err
# mkdir /data
# mkdir /dblog
# chmod 700 /data/ /dblog
# chown mysql.mysql /data /dblog/ -R
# mysql_install_db –datadir=/data –user=mysql
# service mysql start
# chkconfig mysql on
# less /tmp/all.sql
– CHANGE MASTER TO MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=483898;
# mysql < /tmp/all.sql
# mysql
mysql> flush privileges;
mysql> change master to
-> MASTER_HOST='192.168.1.11',
-> MASTER_USER='slave',
-> MASTER_PASSWORD='123',
-> MASTER_LOG_FILE='mysqld-bin.000005',
-> MASTER_LOG_POS= 483898,
-> MASTER_CONNECT_RETRY=10; –默认是60秒
Query OK, 0 rows affected (0.02 sec)
mysql>start slave;
验证:
从master上插入一条记录查看slave1和slave2有无相应的更新?如有更新,正常,如没有更新需查看错误日志进行检查
当停掉slave(stop slave)后,再启动slave,为什么还能更新,因有/data/master.info、/data/relay-log.info;
/data/master.info:记录有change master to时输入的偏移量,以及bin-log文件名
/data/relay-log.info:记录有mysqld-relay-bin文件,和bin-log文件