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.7 23 数据库版本:MySQL 5.6.30 (源码) 24 主机IP:172.18.0.105 25 实例数量:3 26 27 二 实施规划: 28 1 二进制程序位置: /usr/local/mysql 29 30 2 监听的端口:3306,3307,3308 31 32 3 配置文件:/etc/mysql/3306/my.cnf 33 /etc/mysql/3307/my.cnf 34 /etc/mysql/3308/my.cnf 35 36 4 数据文件:/mydata/data/3306 37 /mydata/data/3307 38 /mydata/data/3308 39 40 5 服务日志:/var/log/mysql3306.log 41 /var/log/mysql3307.log 42 /var/log/mysql3308.log 43 44 6 pid文件路径:/var/run/mysqld/3306.pid 45 /var/run/mysqld/3307.pid 46 /var/run/mysqld/3308.pid 47 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 mysql 57 shell>mkdir /mydata/{data,log-bin,log-relay}/{3306,3307,3308} -pv 58 59 2. 编译安装MySQL (此处本人使用脚本安装) 60 shell>tar xfv mysql-5.6.30.tar.gz 61 shell>cd mysql-5.6.30 62 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=1 80 shell>make install 81 82 3. 初始化mysql数据库(两种方式) 83 A.通过mysql_install_db命令为每一个实例提供初始化数据(干净的数据库) 84 shell>/usr/local/mysql/bin/mysql_install_db --basedir=/mydata/data/3306 --user=mysql 85 shell>/usr/local/mysql/bin/mysql_install_db --basedir=/mydata/data/3307 --user=mysql 86 shell>/usr/local/mysql/bin/mysql_install_db --basedir=/mydata/data/3308 --user=mysql 87 88 B.通过复制一个实例的初始化数据文件到其他实例的数据目录(主从复制可以使用此种方式,更快捷) 89 shell>/usr/local/mysql/bin/mysql_install_db --basedir=/mydata/data/3306 --user=mysql 90 shell>for i in 3307 3308;do cp -ra /mydata/data/3306/* /mydata/data/$i;done 91 shell>for i in 3307 3308;do rm -rf /mydata/data/$i/auto.cnf;done 92 shell>cat /mydata/data/3306/auto.cnf 93 [auto] 94 server-uuid=504e62be-92bd-11e6-8fb9-000c295a3442 95 96 说明:这个数据目录下的auto.cnf 记录了每个MySQL实例启动后生成的uuid,如果在做mysql的主从复制,则要求这个uuid在主从复制集群中唯一
97 删除后mysql重启自动生成,所以第3步使用cp初始化mysql数据时一定要小心这个文件,此文件就是由进程实时生成的,所以在做多实例一定
98 要考虑周全,此外使用虚拟化技术克隆虚拟机时也要注意此问题。
99 100 101 4. 创建mysql配置文件如下: 102 shell>grep "^[^#]" /etc/mysql/3306/my.cnf 103 [mysqld] 104 datadir=/mydata/data/3306 105 socket=/mydata/data/3306/mysql.sock 106 port=3306 107 pid-file=/var/run/mysqld/3306.pid 108 log-error=/var/log/mysqld3306.log 109 user=mysql 110 innodb_file_per_table=ON 111 skip_name_resolve=ON 112 log-bin=/mydata/log-bin/3308/mysql-bin 113 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 114 115 shell>grep ‘^[^#]‘ /etc/mysql/3306/my.cnf | sed ‘s@3306@3307@g‘ > /etc/mysql/3307/my.cnf 116 shell>grep ‘^[^#]‘ /etc/mysql/3306/my.cnf | sed ‘s@3306@3308@g‘ > /etc/mysql/3308/my.cnf 117 118 说明:上面由于使用基于端口的统一命令规范,所以在操作时搭配sed命令会非常自由灵活高效 119 120 5.修改mysql相关文件的权限使mysql进程对其有权限,并启动MySQL实例 121 shell>chown -R mysql.mysql /mydata 122 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.log 128 129 mysql进程可以接受SIGHUP信号完成reload功能,所以sys 风格脚本可以根据需要编写,此处省略 130 131 6.连接mysql,需要指定连接的端口和所用的unix sock文件(如果使用套接字通信时) 132 shell>mysql -P 3306 -S /mydata/data/3306/mysql.sock 133 134 说明:mysql在完成最基本的功能后,还要根据指定的策略完成mysql安全配置 135 136 五 添加一个mysql实例,比如3309 137 138 1.shell>for i in `ls /mydata/`;do mkdir /mydata/$i/3309;done 139 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.cnf 143 4.shell>chown -R mysql.mysql /mydata 144 5.shell>mysqld_safe --defaults-file=/etc/mysql/3309/my.cnf &> /dev/null & 145 146 六 总结: 147 148 进程多实例需要注意的问题: 149 1 运行多实例的主机一定要系统硬件资源跟的上,每增加一个实例都要查看系统剩余资源 150 2 由于多实例存在一台主机上所以一旦主机宕机,如果没有做备分就导致灾难性业务中断 151 3 对于相同进程在执行命令的时候一定要慎之又慎,尤其是带有通配功能的命令,比如pkill,killall 152 4 依靠ip对此进程部署或者监控的工具,需要更困难的判断条件 153 154
原文:http://www.cnblogs.com/M18-BlankBox/p/5965491.html