技术开发 频道

MySQL主从复制读写分离实现

  【IT168技术文档】MySQL主从复制

  (一)安装mysql(主从服务器皆相同) 先创建用户

  useradd mysql -s /sbin/nologin

  tar zxvf mysql-5.0.45.tar.gz

  cd mysql-5.0.45

  ./configure --prefix=/usr/local/mysql --localstatedir=/opt/data --with-extra-charsets=utf8,gb2312,gbk --with-pthread --enable-thread-safe-client

  注:配置过程指定数据文件的位置及另加的字符集.

  make

  make install

  cp support-files/my-large.cnf /etc/my.cnf

  cd /usr/local/mysql

  chgrp -R mysql .

  生成基本的数据库和表: /usr/local/mysql/bin/mysql_install_db --user=mysql

  成功执行后察看数据目录/opt/data,看是否有文件或目录生成.

  chown -R mysql:mysql /opt/data

  记得给每个数据库设置root密码.

  (二)修改配置文件

  不同的地方就是server-id,主服务器配置文件不用修改,从服务器的配置文件server-id=10.其他的内容基本相同.

  (三)启动服务

  /usr/local/mysql/bin/mysqld_safe --user=mysql&

  这个过程主辅服务器都相同.

  (四)授权(在主服务器上进行)

  GRANT REPLICATION SLAVE ON *.* to 'rep1'@'192.168.8.100 identified by 'mylqs';

  (五)查询主数据库状态(主服务器上进行)

  mysql> show master status;

  +------------------+----------+--------------+------------------+

  | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

  +------------------+----------+--------------+------------------+

  | mysql-bin.000003 | 235 | | |

  +------------------+----------+--------------+------------------+

  记下file及position的值,后面做从服务器操作的时候需要用.

  (六)配置从服务器

  mysql> change master to master_host='192.168.8.101', master_user='rep1', master_password='mysql', master_log_file='mysql-bin.000003', master_log_pos=235;

  正确执行后再执行:

  mysql> start slave;

  就启用了复制功能.这里我们运行一下 mysql> show slave status\G 来检查一下,一个正常的输出结果应该如下面的形式:  

1 mysql> show slave status\G
2 *************************** 1. row ***************************
3              Slave_IO_State: Waiting for master to send event
4                 Master_Host: 192.168.8.101
5                 Master_User: rep1
6                 Master_Port: 3306
7               Connect_Retry: 60
8             Master_Log_File: mysql-bin.000003
9         Read_Master_Log_Pos: 235
10              Relay_Log_File: -relay-bin.000009
11               Relay_Log_Pos: 235
12       Relay_Master_Log_File: mysql-bin.000003
13            Slave_IO_Running: Yes
14           Slave_SQL_Running: Yes
15             Replicate_Do_DB:
16         Replicate_Ignore_DB:
17          Replicate_Do_Table:
18      Replicate_Ignore_Table:
19     Replicate_Wild_Do_Table:
20 Replicate_Wild_Ignore_Table:
21                  Last_Errno: 0
22                  Last_Error:
23                Skip_Counter: 0
24         Exec_Master_Log_Pos: 235
25             Relay_Log_Space: 235
26             Until_Condition: None
27              Until_Log_File:
28               Until_Log_Pos: 0
29          Master_SSL_Allowed: No
30          Master_SSL_CA_File:
31          Master_SSL_CA_Path:
32             Master_SSL_Cert:
33           Master_SSL_Cipher:
34              Master_SSL_Key:
35       Seconds_Behind_Master: 0
36 1 row in set (0.00 sec)

  请注意:slave_IO进程及slave_SQL进程都必须正常运行,在状态输出重表现为: Slave_IO_Running: Yes 及Slave_SQL_Running: Yes否则都是不正确的状态(如一个值Yes,另外一个是NO则不行).

  (七)主数据库有数据的情况:

  1、数据库锁表操作,不让数据再进行写入动作。mysql> FLUSH TABLES WITH READ LOCK;

  2、察看主数据库的状态 mysql> show master status; 照第(五)步记录输出值。

  3、把主服务器数据文件复制到从服务器,最好先用tar处理一下。

  4、取消主数据库锁定 mysql> UNLOCK TABLES;

  5、从服务器的操作。跟前面的步骤一样(略过)

  MySQL代理安装配置

  一、安装mysql-proxy.需要按下列顺序安装其所依赖的包:

  (一)安装LUA

  tar zxvf lua-5.1.tar.gz

  cd lua-5.1

  用vi修改Makefile,使"INSTALL_TOP=/usr/local/lua",这样做的目的是为了是lua的所有文件都安装在目录/usr/local/lua/

  make posix

  make install

  (二)安装 libevent

  tar zxvf libevent-1.1a.tar.gz

  cd libevent-1.1a

  ./configure --prefix=/usr/local/libevent

  make

  make install

  (三)安装check

  tar zxvf check-0.8.4.tar.gz

  cd check-0.8.4

  ./configure

  make

  make install

  (四)设置安装mysql-proxy所需的环境变量.把下面的内容追加到/etc/profile中

  export LUA_CFLAGS="-I/usr/local/lua/include" LUA_LIBS="-L/usr/local/lua/lib -llua -ldl" LDFLAGS="-L/usr/local/libevent/lib -lm"

  export CPPFLAGS="-I/usr/local/libevent/include"

  export CFLAGS="-I/usr/local/libevent/include"

  然后执行 source /etc/profile (安装完mysql-proxy不再需要这些变量,可以删除之)

  (五)安装mysql(只安装mysql客户端即可)

  tar zxvf mysql-5.0.45.tar.gz

  cd mysql-5.0.45

  ./configure --prefix=/usr/local/mysql --without-server

  make

  make install

  (六)安装mysql-proxy

  tar zxvf mysql-proxy-0.5.0.tar.gz

  cd mysql-proxy-0.5.0

  ./configure –prefix=/usr/local/mysql-proxy --with-mysql=/usr/local/mysql --with-lua

  Make

  Make install

  二、主要的命令行选项

  --help-all显示所有的帮助选项

  --admin-address=host:port 管理主机及端口,默认是4041

  --proxy-address=host:port 代理服务器的监听地址及端口,默认4040

  --proxy-read-only-address=host:port 只读连接时,代理服务器的监听地址及端口。默认4042

  --proxy-backend-addresses=host:port连接真实服务器的地址及监听端口,默认是3306,这是mysql代理最重要的选项,多个主机之间用空格隔开。使用rr算法。

  --proxy-lua-script=file指定lua脚本的名称

  三、使用方法

  2个mysql服务器的情形

  mysql-proxy \

  --proxy-backend-addresses=mysql_ip1:3306 \

  --proxy-backend-addresses=mysql_ip2:3306

  3个服务器的情形:一个主服务器,负责写入;2个从服务器,负责查询。

  mysql-proxy --proxy-backend-addresses= :3306\

  --proxy-read-only-address=:3306 \

  --proxy-read-only-address=:3306

  四、mysql-proxy启动

  编写脚本/usr/local/bin/mysql-proxy.sh其内容如下:

  #!/bin/bash

  LUA_PATH="/usr/local/mysql-proxy/share/mysql-proxy/?.lua" mysql-proxy --proxy-read-only-backend-addresses=192.168.1.38:3306 --proxy-

  backend-addresses=192.168.1.33:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/mysql-proxy/rw-splitting.lua >> /var/log/mysql-proxy.log &

  chmod 755 /usr/local/bin/mysql-proxy.sh; 执行命令/usr/local/bin/mysql-proxy.sh启动服务

  配置验证

  1、主从复制测试:在主数据库服务器上创建库和表,然后再插入记录,再登陆到从服务器,看是否也建立相一致的库和表以及记录。

  mysql> create database first_db;

  Query OK, 1 row affected (0.01 sec)

  在主数据库服务器创建库first_db

  mysql> create table first_tb(id int(3),name char(10));

  Query OK, 0 rows affected (0.00 sec)

  在主数据库服务器创建表first_db

  mysql> insert into first_tb values (001,'myself');

  Query OK, 1 row affected (0.00 sec)

  在主数据服务器的表first_db中插入记录

  现在转到从数据库服务器,看是否同步了上面主数据库的数据

  mysql> show databases;

  +--------------------+

  | Database |

  +--------------------+

  | information_schema |

  | first_db |

  | mysql |

  | test |

  +--------------------+

  4 rows in set (0.01 sec)

  数据库自动生成了

  mysql> use first_db;

  Database changed

  mysql> show tables;

  +--------------------+

  | Tables_in_first_db |

  +--------------------+

  | first_tb |

  +--------------------+

  1 row in set (0.00 sec)

  表也自动生成了

  mysql> select * from first_tb;

  +------+--------+

  | id | name |

  +------+--------+

  | 1 | myself |

  +------+--------+

  1 row in set (0.00 sec)

  记录也按照我们的意愿存在了

  2、读写分离:用mysql客户端程序如mysql登陆到mysql代理,然后执行读写操作,以测试读写分离的正确性。

0
相关文章