MySQL多实例,主从同步
时间:2022-03-14 01:18
由于背景原因,所做的主从同步还是要基于MySQL 5.1的版本,主从同步主要是一个数据库读写访问原来的数据库热度过大,需要做到使用从库对读分压。
MySQL主从同步介绍
MySQL 支持单双向、链式级联、异步复制。在复制过程中,一个服务器充当主服务器(Master),而一个或多个其它的服务器充当从服务器(Slave)。 如果设置了链式级联复制,那么,从(slave)服务器本身除了充当从服务器外,也会同时充当其下面从服务器的主服务器。链式级联复制类似A->B ->C ->D 的复制形式。 当配置好主从复制后,所有对数据库内容的更新就必须在主服务器上进行,以避免用户对主服务器上数据内容的更新与对从服务器上数据库内容的更新之间发生冲突。生产环境中一般会,忽略授权表同步,然后对从服务器上的而用户授权select读权限,或在my.cnf配置文件中加read-only 参数来确保从库只读,当然二者同时操作效果更佳。 MySQL主从复制的原理 MySQL 主从复制是一个异步复制过程(但看起来也是实时的),数据库数据从一个MySQL数据库(我们称为Master)复制到另一个MySQL数据库(我们称之为Slave)。在Master和Slave之间实现整个主从复制的过程有三个线程参与完成。其中两个线程(SQL线程和IO线程)在Slave端,另一个线程(IO线程)在Master端。 要实现MySQL的主从复制,首先必须打开Master端的Binlog(MySQL-bin.XXXXX)功能,否则无法实现主从复制。因为整个复制过程实际上就是Slave从Master端获取Binlog日志,然后再在Slave自身上以相同顺序执行binlog日志中所记录的各种操作。打开MySQL的binlog可以通过MySQL的配置文件my.cnf中的mysqld模块([mysqld]标识后的参数部分)添加“log-bin”参数项。 MySQL主从复制过程描述 下面简单描述下MySQL Replication的复制过程: 1.Slave服务器上执行start slave,开启主从复制开关。 2.此时,Slave服务器的IO线程会通过在Master上授权的复制用户请求连接Master服务器,并请求从指定Binlog日志文件的指定位置(日志文件和位置是在配置主从服务时change master 时指定的)之后的Binlog日志内容。 3.Master服务器接收到来自Slave服务器的IO线程的请求后,Master服务器上负责复制IO线程根据Slave服务器的IO线程请求的信息读取指定Binlog日志文件指定位置之后的Binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了日志内容外,还有本次返回日志内容在Master服务器端的新Binlog文件名称以及在Binlog中的指定位置。 4. 当Slave服务器的IO线程获取到来自Master服务器上IO线程发送日志内容及日志文件及位置点后,将Binlog日志内容依次写入到Slave端自身的Relay Log(即中继日志)文件(MySQL-relay-bin.xxxxx)的最末端,并将新的Binlog文件名和位置记录到master-info文件中,以便下一次读取Master端新binlog日志时能够告诉Master服务器需要从新binlog日志的那个文件那个位置开始请求新的Binlog日志内容。 5. Slave服务器的SQL线程会实时的检测本地Relay Log中新增加了日志内容,然后及时的把Log文件中的内容解析成在Master端曾经执行的SQL语句的内容,并在自身Slave服务器上按语句的顺序执行应用这些SQL语句。 6. 经过了上面的过程,就可以确保在Master端和Slave端执行了同样的SQL语句。当复制状态正常的情况下,Master端和Slave端的数据是完全一样的。 主从复制的原理图 具体实施主从复制 下面介绍的测试环境的安装,关于线上的环境不好多讲,具体步骤如下: 单实例安装步骤1.建立MySQL 账户
#groupadd mysql #useradd -s /sbin/nologin -g mysql -M mysql
#tail -l /etc/passwd
建立 MySQL 软件目录
#mkdir -p /home/tools
#cd /home/tools/
2.编译安装MySQL 软件()
#tar zxf mysql-5.1.62.tar.gz #cd mysql-5.1.62
配置
./configure \
--prefix=/usr/local/mysql \
--with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock \
--localstatedir=/usr/local/mysql/data \
--enable-assembler \
--enable-thread-safe-client \
--with-mysqld-user=mysql \
--with-big-tables \
--without-debug \
--with-pthread \
--enable-assembler \
--with-extra-charsets=complex \
--with-ssl \
--with-embedded-server \
--enable-local-infile \
--with-plugins=partition,innobase \
--with-plugin-PLUGIN \
--with-mysqld-ldflags=-all-static \
--with-client-ldflags=-all-static
3.静态编译生成mysqld的执行文件
#make
4.安装MySQL
#make install
5.获取MySQL 配置文件
#ls -l support-files/*.cnf #cp support-files/my-small.cnf /etc/my.cnf
6.创建数据库文件
#mkdir -p /usr/local/mysql/data #chown -R mysql.mysql /usr/local/mysql
#/usr/local/mysql/bin/mysql_install_db --user=mysql
#
7.启动MySQL 数据库
#cp support-files/mysql.server /usr/local/mysql/bin #netstat -lnt|grep 3306
#/user/local/bin/mysql_safe --user=mysql &
8.配置MySQL 命令的全局使用路径
#echo ‘export PATH=$PATH:/usr/local/mysql/bin‘ >>/etc/profile #source /etc/profile
9.配置/etc/init.d/mysqld start 方式启动数据库
#cp support-files/mysql.server /etc/init.d/mysqld #chmod 700 /etc/init.d/mysqld
#/etc/init.d/mysqld restart
多实例安装
1.采用不同的端口来作为二级目录
mkdir -p /data/{3306,3307}/data |
ls -l support-files/*.cnf /bin/cp support-files/my-small.cnf /etc/my.cnf |
vi /data/3306/my.cnf vi /data/3307/my.cnf |
[client] port = 3306 socket = /data/3306/mysql.sock [mysql] no-auto-rehash [mysqld] user = mysql port = 3306 socket = /data/3306/mysql.sock basedir = /usr/local/mysql datadir = /data/3306/data open_files_limit = 1024 back_log = 600 max_connections = 800 max_connect_errors = 3000 table_cache = 614 external-locking = FALSE max_allowed_packet =8M sort_buffer_size = 1M join_buffer_size = 1M thread_cache_size = 100 thread_concurrency = 2 query_cache_size = 2M query_cache_limit = 1M query_cache_min_res_unit = 2k default_table_type = InnoDB thread_stack = 192K transaction_isolation = READ-COMMITTED tmp_table_size = 2M max_heap_table_size = 2M long_query_time = 1 log_long_format log-error = /data/3306/error.log log-slow-queries = /data/3306/slow.log pid-file = /data/3306/mysql.pid log-bin = /data/3306/mysql-bin relay-log = /data/3306/relay-bin relay-log-info-file = /data/3306/relay-log.info binlog_cache_size = 1M max_binlog_cache_size = 1M max_binlog_size = 2M expire_logs_days = 7 key_buffer_size = 16M read_buffer_size = 1M read_rnd_buffer_size = 1M bulk_insert_buffer_size = 1M myisam_sort_buffer_size = 1M myisam_max_sort_file_size = 10G myisam_max_extra_sort_file_size = 10G myisam_repair_threads = 1 myisam_recover lower_case_table_names = 1 skip-name-resolve slave-skip-errors = 1032,1062 replicate-ignore-db=mysql server-id = 1 innodb_additional_mem_pool_size = 4M innodb_buffer_pool_size = 32M innodb_data_file_path = ibdata1:128M:autoextend innodb_file_io_threads = 4 innodb_thread_concurrency = 8 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 2M innodb_log_file_size = 4M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 innodb_file_per_table = 0 [mysqldump] quick max_allowed_packet = 2M [mysqld_safe] log-error=/data/3306/mysql_barry3306.err pid-file=/data/3306/mysqld.pid |
#!/bin/sh
#/data/3306/mysql 脚本 #init port=3306 mysql_user="root" mysql_pwd="" CmdPath="/usr/local/mysql/bin" #startup function function_start_mysql() { printf "Starting MySQL...\n" /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null & } #stop function function_stop_mysql() { printf "Stoping MySQL...\n" ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown } #restart function function_restart_mysql() { printf "Restarting MySQL...\n" function_stop_mysql sleep 2 function_start_mysql } case $1 in start) function_start_mysql ;; stop) function_stop_mysql ;; restart) function_restart_mysql ;; *) printf "Usage: /data/${port}/mysql {start|stop|restart}\n" esac |
tree /data
/data --3306 |--my.cnf |--mysql |--data --3307 |--my.cnf |--mysql |--data #授权 chown -R mysql.mysql /data find /data -name mysql -exec chmod 700 {} \ |
echo ‘export PATH=$PATH:/usr/local/mysql/bin‘ >>/etc/profile source /etc/profile |
mysql_install_db --datadir=/data/3306/data --user=mysql mysql_install_db --datadir=/data/3307/data --user=mysql |
/data/3306/mysql start /data/3307/mysql start #检查MySQL数据是否启动 netstat -lnt|grep 330[6,7] |
echo "/data/3306/mysql start" >>/etc/rc.local echo "/data/3307/mysql start" >>/etc/rc.local |
mysql -S /data/3306/mysql.sock mysql -S /data/3307/mysql.sock |
mysqladmin -u root -S /data/3306/mysql.sock password ‘barry123‘ #<- 更改默认密码。 mysql -S /data/3306/mysql.sock #<- 无法直接登录 mysql -uroot -p -S /data/3306/mysql.sock #<-新的登录方式 |
select user,host form mysql.user |
主从复制配置
主库,称为Master 从库称为Slave。 1. 主库上执行操作 (1) 设置server-id 值并开启binlog设置 根据前文MySQL的同步原理,我们知道复制的关键因素就是binlog日志。 执行 vi /data/3306/my.cnf 编辑my.cnf配置文件,按如下两个参数内容修改:[mysqld] server-id =1 log-bin=/data/3306/mysql-bin |
grep -E "server-id|log-bin" /data/3306/my.cnf log-bin=/data/3306/mysql-bin server-id=1 |
mysql -uroot -p‘‘ -S /data/3306/mysql.sock grant replication slave on *.* to ‘rep‘@‘10.0.0.%‘ identified by ‘password‘; |
flush tables with read lock; interactive_timeout=60 wait_timeout=60 |
mkdir /server/backup/ -p mysqldump -uroot -p‘password‘ -S /data/3306/mysql.sock -A -B |gzip >/server/backup/mysql_bak.${date +%F}.sql.gz ls -l /server/backup/mysql_bak.${date +%F}.sql.gz |
mysql -u root -p‘password‘ -S /data/3306/mysql.sock -e "show master status" |
unlock tables; |
[mysqld] server-id=2 #log-bin=/data/3307/mysql-bin |
gzip -d mysql_bak.2014-04-17.sql.gz mysql -uroot -p‘password‘ -S /data/3307/mysql.sock < mysql_bak.2014-04-17.sql |
mysql -uroot -p‘password‘ -S /data/3307/mysql.sock CHANGE MASTER TO MASTER_HOST=‘10.0.0.x‘, <==这里是主库的IP MASTER_PORT=3306, <==这里是主库的端口,从库端口可以和主库不同。 MASTER_USER=‘rep‘,<==这里是主库上建立的用于复制的用户rep MASTER_PASSWORD=‘password‘, MASTER_LOG_FILE=‘mysql-bin.0000008‘,<==这里是show master status时看到的查到二进制文件名称 MASTER_POS=342;<==这里是show master status时看到的查看二进制日志偏移量,注意不能多空格。 |
cat |mysql -uroot -p‘password‘ -S /data/3307/mysql.sock<< EOF
CHANGE MASTER TO
MASTER_HOST=‘10.0.0.x‘, MASTER_PORT=3306, MASTER_USER=‘rep‘, MASTER_PASSWORD=‘password‘, MASTER_LOG_FILE=‘mysql-bin.0000008‘, MASTER_LOG_POS=342; EOF |
CHANGE MASTER TO
MASTER_HOST=‘192.168.1.234‘, MASTER_PORT=3306, MASTER_USER=‘rep‘, MASTER_PASSWORD=‘password‘, MASTER_LOG_FILE=‘mysql-bin.000010‘, MASTER_LOG_POS=261; |
mysql -uroot -p‘password‘ -S /data/3307/mysql.sock -e "start slave;" mysql -uroot -p‘password‘ -S /data/3307/mysql.sock -e "show slave status\G;" |