Chinaunix首页 | 论坛 | 博客
  • 博客访问: 691655
  • 博文数量: 139
  • 博客积分: 7607
  • 博客等级: 少将
  • 技术积分: 1964
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-11 23:43
个人简介

...

文章分类

全部博文(139)

文章存档

2012年(53)

2011年(4)

2010年(29)

2009年(10)

2008年(33)

2007年(10)

分类: 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文件

阅读(1006) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~