1 MySQL进程多实例配置2 进程多实例概念:3 同一主机启动相同的二进制程序使用各自的配置文件管理资源并通过监听不同的套4 接字对外提供服务,以启动多个进程实现的方式就可理解为进程的多实例。5
6 组成要素:7 1 相同的二进制程序 (rpm包,源码包提供)8 2 不同的配置文件 (文件路径与文件名称)9 3 不同的数据文件 (配置文件里指定)10 4 不同的套接字(ip+port)11 5 不同的进程(pid,根据服务二进制程序支持的选项划分多实例启动标准)12
13 多实例管理与需要注意的问题:14 1 统一命名方式(方便自动化部署实施)15 2 使用独自的日志文件(主要用来统计或者排错)16 3 复制数据资源或者配置文件时需要根据具体服务进行逻辑判断,有的服务运行时产生进程或资源的标识,而且要求全局唯一,所以在两个实例之间复制资源时17 即便改了相关配置,运行时也有可能报错。这时需要借助日志来实时修改,配置mysql的多实例就会产生这种错误18
19 具体示例之MySQL的多实例:20
21 一 配置环境:22 操作系统:CentOS 6.723 数据库版本:MySQL 5.6.30 (源码)24 主机IP:172.18.0.10525 实例数量:326
27 二 实施规划:28 1 二进制程序位置: /usr/local/mysql29
30 2 监听的端口:3306,3307,330831
32 3 配置文件:/etc/mysql/3306/my.cnf33 /etc/mysql/3307/my.cnf34 /etc/mysql/3308/my.cnf35
36 4 数据文件:/mydata/data/330637 /mydata/data/330738 /mydata/data/330839
40 5 服务日志:/var/log/mysql3306.log41 /var/log/mysql3307.log42 /var/log/mysql3308.log43
44 6 pid文件路径:/var/run/mysqld/3306.pid45 /var/run/mysqld/3307.pid46 /var/run/mysqld/3308.pid47
48 7 进程启动:根据--defaults-file选项来作为启动标准进而区分不同实例49 shell>/usr/local/mysql/bin/mysqld_safe --defaults-file="实例配置文件路径"50
51 三 实施思想52 先配置一个mysql--》复制相同数据到其他实例—》修改配置文件—》启动53
54 四 具体实施步骤55 1. 创建MySQL用户与数据目录56 shell>useradd -r mysql57 shell>mkdir /mydata/{data,log-bin,log-relay}/{3306,3307,3308} -pv58
59 2. 编译安装MySQL (此处本人使用脚本安装)60 shell>tar xfv mysql-5.6.30.tar.gz61 shell>cd mysql-5.6.3062 shell>cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \63 -DMYSQL_DATADIR=/mydata/data/ \64 -DSYSCONFDIR=/etc/ -DWITH_INNOBASE_STORAGE_ENGINE=1 \65 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \66 -DWITH_FEDERATED_STORAGE_ENGINE=1 \67 -DWITH_ARCHIVE_STORAGE_ENGINE=1 \68 -DWITH_READLINE=1 \69 -DWITH_SSL=system \70 -DWITH_ZLIB=system \71 -DWITH_LIBWRAP=0 \72 -DMYSQL_UNIX_ADDR=/mydata/data/mysql.sock \73 -DDEFAULT_CHARSET=utf8 \74 -DDEFAULT_COLLATION=utf8_general_ci \75 -DMYSQL_TCP_PORT=3306 \76 -DENABLED_LOCAL_INFILE=1 \77 -DWITH_DEBUG=0 -DENABLED_PROFILING=1 \78 -DWITH_EXTRA_CHARSETS=all \79 -DWITH_INNODB_MEMCACHED=180 shell>make install81
82 3. 初始化mysql数据库(两种方式)83 A.通过mysql_install_db命令为每一个实例提供初始化数据(干净的数据库)84 shell>/usr/local/mysql/bin/mysql_install_db --basedir=/mydata/data/3306 --user=mysql85 shell>/usr/local/mysql/bin/mysql_install_db --basedir=/mydata/data/3307 --user=mysql86 shell>/usr/local/mysql/bin/mysql_install_db --basedir=/mydata/data/3308 --user=mysql87
88 B.通过复制一个实例的初始化数据文件到其他实例的数据目录(主从复制可以使用此种方式,更快捷)89 shell>/usr/local/mysql/bin/mysql_install_db --basedir=/mydata/data/3306 --user=mysql90 shell>for i in 3307 3308;do cp -ra /mydata/data/3306/* /mydata/data/$i;done91 shell>for i in 3307 3308;do rm -rf /mydata/data/$i/auto.cnf;done92 shell>cat /mydata/data/3306/auto.cnf93 [auto]94 server-uuid=504e62be-92bd-11e6-8fb9-000c295a344295
96 说明:这个数据目录下的auto.cnf 记录了每个MySQL实例启动后生成的uuid,如果在做mysql的主从复制,则要求这个uuid在主从复制集群中唯一
97 删除后mysql重启自动生成,所以第3步使用cp初始化mysql数据时一定要小心这个文件,此文件就是由进程实时生成的,所以在做多实例一定
98 要考虑周全,此外使用虚拟化技术克隆虚拟机时也要注意此问题。
99100
101 4. 创建mysql配置文件如下:102 shell>grep "^[^#]" /etc/mysql/3306/my.cnf103 [mysqld]104 datadir=/mydata/data/3306105 socket=/mydata/data/3306/mysql.sock106 port=3306107 pid-file=/var/run/mysqld/3306.pid108 log-error=/var/log/mysqld3306.log109 user=mysql110 innodb_file_per_table=ON111 skip_name_resolve=ON112 log-bin=/mydata/log-bin/3308/mysql-bin113 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES114
115 shell>grep '^[^#]' /etc/mysql/3306/my.cnf | sed 's@3306@3307@g' > /etc/mysql/3307/my.cnf116 shell>grep '^[^#]' /etc/mysql/3306/my.cnf | sed 's@3306@3308@g' > /etc/mysql/3308/my.cnf117
118 说明:上面由于使用基于端口的统一命令规范,所以在操作时搭配sed命令会非常自由灵活高效119
120 5.修改mysql相关文件的权限使mysql进程对其有权限,并启动MySQL实例121 shell>chown -R mysql.mysql /mydata122 shell>mysqld_safe --defaults-file=/etc/mysql/3306/my.cnf &> /dev/null &123 shell>mysqld_safe --defaults-file=/etc/mysql/3307/my.cnf &> /dev/null &124 shell>mysqld_safe --defaults-file=/etc/mysql/3308/my.cnf &> /dev/null &125
126 说明:如果有哪个实例启动不了,一般是mysql进程访问某个文件权限问题或者与其他实例冲突(比如配置文件里没指定port选项,使用mysqld_safe启动也没指定--port)127 也可以查看对应实例的日志文件 /var/log/mysql$port.log128
129 mysql进程可以接受SIGHUP信号完成reload功能,所以sys 风格脚本可以根据需要编写,此处省略130
131 6.连接mysql,需要指定连接的端口和所用的unix sock文件(如果使用套接字通信时)132 shell>mysql -P 3306 -S /mydata/data/3306/mysql.sock133
134 说明:mysql在完成最基本的功能后,还要根据指定的策略完成mysql安全配置135
136 五 添加一个mysql实例,比如3309137
138 1.shell>for i in `ls /mydata/`;do mkdir /mydata/$i/3309;done139 2.shell>/usr/local/mysql/bin/mysql_install_db --basedir=/mydata/data/3309 --user=mysql (干净的mysql)140 或141 shell>cp -ra /mydata/data/3306/* /mydata/data/3309 (主从复制)142 3.shell>grep '^[^#]' /etc/mysql/3306/my.cnf | sed 's@3306@3309@g' > /etc/mysql/3309/my.cnf143 4.shell>chown -R mysql.mysql /mydata144 5.shell>mysqld_safe --defaults-file=/etc/mysql/3309/my.cnf &> /dev/null &145
146 六 总结:147
148 进程多实例需要注意的问题:149 1 运行多实例的主机一定要系统硬件资源跟的上,每增加一个实例都要查看系统剩余资源150 2 由于多实例存在一台主机上所以一旦主机宕机,如果没有做备分就导致灾难性业务中断151 3 对于相同进程在执行命令的时候一定要慎之又慎,尤其是带有通配功能的命令,比如pkill,killall152 4 依靠ip对此进程部署或者监控的工具,需要更困难的判断条件153
154