mysql多实例的安装以及主从复制配置

1.mysql多实例的安装
1)配置文件
# cat /etc/my.cnf.multi
[mysqld_multi]
mysqld=/usr/bin/mysqld_safe   //mysqld的路径
mysqladmin=/usr/bin/mysqladmin //mysqladmin的路径
user=root   //使用用户
[mysqld1]   //1表示标识第一个数据库实例,如下5项为多实例下必须标识的变量
port=3306
socket=/var/lib/mysql/mysql.sock
datadir=/var/lib/mysql
pid-file=/var/lib/mysql/mysql.pid
user=mysql
[mysqld2]
port=3307
socket=/var/lib/mysql3307/mysql3307.sock
datadir=/var/lib/mysql3307
pid-file=/var/lib/mysql3307/mysql3307.pid
user=mysql
2)配置过程
a.建立datadir=/var/lib/mysql3307
mkdir -p /var/lib/mysql3307
chown mysql:mysql /var/lib/mysql3307
b.初始化3307数据库文件
mysql_install_db –datadir=/var/lib/mysql3307 –user=mysql
c.多实例的启动
通过命令mysqld_multi –config-file=/etc/my.cnf.multi report可以查看多实例的运行状态,结果如下:
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 not running
说明实例1正在运行中,实例2没有运行,此时可以通过:
mysqld_multi –config-file=/etc/my.cnf.multi start 2的方式启动实例2,并通过report参数进行查询。
关闭实例的命令为:
mysqld_multi –config-file=/etc/my.cnf.multi stop 2
如果在start和stop的后面不添加实例号码的话,将是对所有实例的操作!要小心!
——————————————————————————————————————————
2.mysql主从复制配置
1)主从复制原理
Mysql的 Replication是一个异步的复制过程,从Master复制到Slave。在Master和Slave实现整个复制过程由三个线程来完成,其中两个 线程(Sql线程和IO线程)在Slave端,另外一个线程(IO线程)在 Master端。要实现复制过程,Master必须打开Binary Log功能,复制过程就是Slave从Master端获取mysql-bin.xxxxxx日志然后在自己身上完全顺序的执行日志中所记录的各种操作。
2)主从复制过程
a.Slave上面的IO线程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
b.Master接收到来自Slave的IO线程的请求后,通过负责复制的IO线程根据请求信息读取指定日志指 定位置之后的日志信息,返回给Slave端的IO线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在Master端的Binary Log文件的名称以及在BinaryLog中的位置;
c.Slave的IO线程接受到信息后,将接收到的日志内容依次写入到Slave端的Relay Log文件的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中(下一次Slave请求时用)。
d.Slave的SQL线程检测到Relay Log中新增加了内容后,会马上解析该Log文件中的内容成为在 Master端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。
-
3)主从复制配置实例
a.master机器:192.168.100.19 3306,slave机器:192.168.100.22 3306
b.分别在master上和slave上创建一个用于复制的数据库repl: create database repl;
c.在master的配置文件/etc/my.cnf.multi中的[mysqld1]增加如下配置:
server-id=1 //master的id,通常为1
log-bin=mysql-bin  //打开Binary Log功能
binlog-do-db=repl  //需要同步的数据库,如果没有这个参数,表示通报所有数据库
d.在master机上为slave机添加一同步帐号
mysql> grant replication slave on *.* to identified by ‘repl’;
-
e.在slave的配置文件/etc/my.cnf.multi中的[mysqld1]增加如下配置:
server-id=2  //slave id
master-host=192.168.100.19  //master ip
master-user=repl   //连接master的账号
master-password=repl  //连接master的密码
master-port=3306      //master port
master-connect-retry=60
replicate-do-db=repl   //需要同步的
-
f.重启master
d_multi –config-file=/etc/my.cnf.multi stop 1
mysqld_multi –config-file=/etc/my.cnf.multi start 1
用show master status 命令查看如下:
mysql> show master status;
+————+———-+————–+——————+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+————+———-+————–+——————+
| log.000002 |      626 | repl         |                  |
+————+———-+————–+——————+
g.重启slave
mysqld_multi –config-file=/etc/my.cnf.multi stop 1
mysqld_multi –config-file=/etc/my.cnf.multi start 1
用show slave status查看如下:(如果Slave_IO_Running、Slave_SQL_Running状态为Yes则表明设置成功)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.100.19
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: log.000002
Read_Master_Log_Pos: 626
Relay_Log_File: mysql-relay-bin.000004
Relay_Log_Pos: 229
Relay_Master_Log_File: log.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: repl
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: 626
Relay_Log_Space: 229
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: 0
1 row in set (0.00 sec)
-
h.测试
在master建一个表并插入数据:
mysql> CREATE TABLE `vendors` (
->   `vend_id` int(11) NOT NULL auto_increment,
->   `vend_name` char(50) NOT NULL,
->   `vend_address` char(50) default NULL,
->   `vend_city` char(50) default NULL,
->   `vend_state` char(5) default NULL,
->   `vend_zip` char(10) default NULL,
->   `vend_country` char(50) default NULL,
->   PRIMARY KEY  (`vend_id`)
-> );
mysql> insert into vendors values(’1′,’zou’,'tianhe’,'guangzhou’,'cn’,’5100′,’zhongguo’);
在slave查看是否有数据:
mysql> select * from vendors;
+———+———–+————–+———–+————+———-+————–+
| vend_id | vend_name | vend_address | vend_city | vend_state | vend_zip | vend_country |
+———+———–+————–+———–+————+———-+————–+
|       1 | zou       | tianhe       | guangzhou | cn         | 5100     | zhongguo     |
+———+———–+————–+———–+————+———-+————–+
——————————————————————————————————————————
3.mysql配置其他常见的参数说明
skip-locking  //避免mysql外部锁定,减少出错几率,增强稳定性
skip-name-resolve  //取消DNS的反向解析
back_log = 64   //指定MySQL可能的连接数量,该参数指出参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。
key_buffer_size = 256M  //用于索引块的缓冲区大小,增加它可得到更好处理的索引
max_allowed_packet = 8M  //一个查询语句包的最大尺寸。
table_cache = 256K  //所有线程打开表的数量
sort_buffer_size = 6M
net_buffer_length = 256K 通信缓冲区在查询期间被重置到该大小
read_buffer_size = 4M  //读查询操作所能使用的缓冲区大小,如果有100个链接,则实际分配缓冲区为100*4=400M
read_rnd_buffer_size = 2M
join_buffer_size = 8M  //用于全部联合(join)的缓冲区大小(不是用索引的联结)。缓冲区对2个表间的每个全部联结分配一次缓冲区,当增加索引不可能时,增加该值可得到一个更快的全部联结。(通常得到快速联结的最佳方法是增加索引。)
myisam_sort_buffer_size = 64M
query_cache_size = 8M
max_connections=2000  //允许同时连接MySQL服务器的客户数量。如果超出该值,MySQL会返回Too many connections错误
max_connect_errors=99999  //如果有多于该数量的中断连接,将阻止进一步的连接;如需对该主机进行解禁,执行:FLUSH HOST;
thread_cache_size=128
thread_concurrency = 8
log_slow_queries = slow_queries.log //开启慢查询日志
long_query_time = 1  //如果一个查询所用时间大于此时间,slow_queried计数将增加
default-character-set=utf8
lower_case_table_names=1  //MySQL总使用小写字母进行SQL操作
innodb_buffer_pool_size = 3000M //InnoDB 存储引擎的表数据和索引数据的最大内存缓冲区大小,适当的增加这个参数的大小,可以有效的减少InnoDB类型的表的磁盘I/O 。在一个以 InnoDB 为主的专用数据库服务器上,可以考虑把该参数设置为物理内存大小的 60%-80% 。
innodb_additional_mem_pool_size = 50M //这个参数用来设置InnoDB存储的数据目录信息和其它内部数据结构的内存池大小。如果 InnoDB 用光了这个池内的内存,InnoDB开始从操作系统分配内存,并且往MySQL错误日志写警告信息。
expire_logs_days = 30  //Binary Log自动删除的天数