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