myCat讀寫分離+傳統主從

1 Mycat介紹:

  • mycat是最近很火的一款國人發明的分佈式數據庫中間件,它是基於阿里的cobar的基礎上進行開發的
  • 準備環境:
  • db01主   10.0.0.51
  • db02備   10.0.0.52
  • mycat     10.0.0.53
[root@mycat ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Sat 2018-01-20 08:41:30 CST; 5 days ago
 Main PID: 1253 (code=exited, status=0/SUCCESS)

Jan 20 01:43:52 db03 systemd[1]: Starting firewalld - dynamic firewall daemon...
Jan 20 01:43:56 db03 systemd[1]: Started firewalld - dynamic firewall daemon.
Jan 20 08:41:27 mycat systemd[1]: Stopping firewalld - dynamic firewall daemon...
Jan 20 08:41:30 mycat systemd[1]: Stopped firewalld - dynamic firewall daemon.
[root@mycat ~]# getenforce 
Disabled

主從搭建:前端

  • mysql簡易優化配置文件
[root@db01 local]# cat /etc/my.cnf
[client]
socket = /data/mysql.sock
[mysqld]
lower_case_table_names = 1
default-storage-engine = InnoDB
port = 3306
datadir = /data
character-set-server = utf8
socket = /data/mysql.sock
log_bin=mysql-bin                    #主從開啓binlog
server_id = 1                        #serverID不能相同
innodb_buffer_pool_size = 200M
slave-parallel-workers = 8
thread_cache_size = 600
back_log = 600
slave_net_timeout = 60
max_binlog_size = 512M
key_buffer_size = 8M
query_cache_size = 64M
join_buffer_size = 2M
sort_buffer_size = 2M
query_cache_type = 1
thread_stack = 192K
innodb_thread_concurrency = 8
connect_timeout = 300
max_connections = 6000
max_allowed_packet = 2048M
max_connect_errors = 6000
wait_timeout = 200000
interactive_timeout = 200000
table_open_cache = 256
innodb_write_io_threads = 16
innodb_read_io_threads = 16
innodb_flush_log_at_trx_commit = 2
slow_query_log = 1
long_query_time = 1
lower_case_table_names = 1
skip-name-resolve

 1.1 mysql傳統主從搭建  

  • db01
mysql> GRANT REPLICATION SLAVE ON *.* TO rep@'10.0.0.%' IDENTIFIED BY '123456';
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 |      403 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  • db02
mysql> change master to master_host='10.0.0.51',master_user='rep',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=403;

2 mycat的主從切換和讀寫分離

2.1 什麼是讀寫分離

  •   在數據庫集羣架構中,讓主庫負責處理事務性查詢,而從庫只負責處理select查詢,讓二者分工明確達到提升數據庫總體讀寫性能。固然,主數據庫另一個功能就是負責將事務性查詢致使的數據變動同步到從庫中,也就是寫操做。

2.2 讀寫分離的好處

  1. 分攤服務器壓力,提升機器的系統處理效率
  2. 讀寫分離適用於讀遠比寫的場景,若是有一臺服務器,當select不少時,update和delete會被這些select訪問中的數據堵塞,等待select結束,併發性能並不高,而主從只負責各自的寫和讀,極大程度的緩解X鎖和S鎖爭用;
  3. 假如咱們有1主3從,不考慮上述1中提到的從庫單方面設置,假設如今1分鐘內有10條寫入,150條讀取。那麼,1主3從至關於共計40條寫入,而讀取總數沒變,所以平均下來每臺服務器承擔了10條寫入和50條讀取(主庫不承擔讀取操做)。所以,雖然寫入沒變,可是讀取大大分攤了,提升了系統性能。另外,當讀取被分攤後,又間接提升了寫入的性能。因此,整體性能提升了,說白了就是拿機器和帶寬換性能;
  4. 增長冗餘,提升服務可用性,當一臺數據庫服務器宕機後能夠調整另一臺從庫以最快速度恢復服務

2.3  搭建mycat

#mycat須要安裝jdk(方法略)
#mycat下載地址
#https://github.com/MyCATApache/Mycat-download/blob/master/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@mycat src]# pwd
/usr/local/src
[root@mycat src]# tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
[root@mycat src]# cd ../mycat/
[root@mycat mycat]# cd conf/
[root@mycat conf]# cat schema.xml 
<?xml version="1.0"?>  
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">  
<mycat:schema xmlns:mycat="http://io.mycat/">  
  
    <!-- 邏輯庫配置 DB1,DB2是邏輯庫並非真的數據庫-->  
    <schema name="DB1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>  
    <schema name="DB2"  checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"/>  
        <!-- 表分片配置在這些 -->  
         <!--</schema>  -->
      
    <!-- 節點配置  db1,db2纔是真正的數據庫 -->  
    <dataNode name="dn1" dataHost="host01" database="db1" />  
    <dataNode name="dn2" dataHost="host01" database="db2" />  
      
    <!-- 讀寫分離的配置 -->  
    <dataHost name="host01" maxCon="1000" minCon="10" balance="1"  
          writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">  
        <heartbeat>show slave status</heartbeat>  
          
        <writeHost host="hostM1" url="10.0.0.51:3306" user="root" password="123456">  
            <!-- 能夠在這配置它對應的多個讀庫 -->  
             <readHost host="hostS1" url="10.0.0.52:3306" user="root" password="123456" /> 
        </writeHost>  
          
        <!--主故障,頂替寫節點,主正常是分擔讀壓力-->  
        <writeHost host="hostS2" url="10.0.0.52:3306" user="root" password="123456" > </writeHost>
    </dataHost>  
      
</mycat:schema>  

2.3.1 修改server.xml

        <user name="root">
                <property name="password">123456</property>
                <property name="schemas">DB1,DB2</property>

                <!-- 表級 DML 權限設置 -->
                <!--            
                <privileges check="false">
                        <schema name="TESTDB" dml="0110" >
                                <table name="tb01" dml="0000"></table>
                                <table name="tb02" dml="1111"></table>
                        </schema>
                </privileges>           
                 -->
        </user>

        <user name="user">
                <property name="password">user</property>
                <property name="schemas">DB1,DB2</property>
                <property name="readOnly">true</property>
        </user>

2.3.2 啓動mycat

[root@mycat conf]# echo "export PATH=/usr/local/mycat/bin:$PATH" >> /etc/profile
[root@mycat conf]# mycat console #前臺啓動是否報錯
[root@mycat conf]# mycat start     #啓動mycat
[root@mycat conf]# mycat stop     #啓動mycat
[root@mycat conf]# ss -lntup|grep java
tcp    LISTEN     0      1      127.0.0.1:32000           *:*                    users:(("java",pid=17930,fd=4))
tcp    LISTEN     0      100      :::9066                 :::*                   users:(("java",pid=17930,fd=72))
tcp    LISTEN     0      50       :::43410                :::*                   users:(("java",pid=17930,fd=54))
tcp    LISTEN     0      50       :::48064                :::*                   users:(("java",pid=17930,fd=56))
tcp    LISTEN     0      50       :::1984                 :::*                   users:(("java",pid=17930,fd=55))
tcp    LISTEN     0      100      :::8066                 :::*                   users:(("java",pid=17930,fd=76))
#9066管理端口
#8066虛擬schema的登錄端口

2.3.3 登陸管理端口

[root@db01 ~]# mysql -uroot -p123456 -h 10.0.0.53 -P 9066
mysql> show @@datasource;
+----------+--------+-------+-----------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME   | TYPE  | HOST      | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+-----------+------+------+--------+------+------+---------+-----------+------------+
| dn1      | hostM1 | mysql | 10.0.0.51 | 3306 | W    |      0 |   10 | 1000 |     131 |         0 |          0 |
| dn1      | hostS2 | mysql | 10.0.0.52 | 3306 | W    |      0 |    1 | 1000 |     119 |         0 |          0 |
| dn1      | hostS1 | mysql | 10.0.0.52 | 3306 | R    |      0 |    8 | 1000 |     126 |         0 |          0 |
| dn2      | hostM1 | mysql | 10.0.0.51 | 3306 | W    |      0 |   10 | 1000 |     131 |         0 |          0 |
| dn2      | hostS2 | mysql | 10.0.0.52 | 3306 | W    |      0 |    1 | 1000 |     119 |         0 |          0 |
| dn2      | hostS1 | mysql | 10.0.0.52 | 3306 | R    |      0 |    8 | 1000 |     126 |         0 |          0 |
+----------+--------+-------+-----------+------+------+--------+------+------+---------+-----------+------------+
6 rows in set (0.01 sec)
#使用mysql客戶端鏈接9066管理端口,執行 show @@datasource 能夠觀察到 READ_LOAD,WRITE_LOAD 兩個統計參數的變化:
#這裏顯示 hostM1 爲寫節點,hostS1 爲讀節點:
#hostM1 的 WRITE_LOAD 寫入次數
#hostS1 的 READ_LOAD  讀出次數

2.3.4 登陸虛擬庫端口

[root@db01 ~]# mysql -uroot -p123456 -h 10.0.0.53 -P 8066
mysql> show databases;
+----------+
| DATABASE |
+----------+
| DB1      |    #DB1是虛擬庫名稱
| DB2      |    #DB1是虛擬庫名稱
+----------+
2 rows in set (0.00 sec)
mysql> use DB1
mysql> create table tb1 (id INT, name VARCHAR(20));
mysql> insert into tb1 values (1, 'guli'), (2, 'xie');
mysql> insert into tb1 values (3, 'ccc'), (4, 'ddd');
mysql> insert into tb1 values (5, 'eee'), (6, 'fff');
mysql> insert into tb1 values (7, 'ggg'), (8, 'hhh');
mysql> select * from tb1;#(多查看幾回增長READ_LOAD次數)
[root@db01 ~]# mysql -uroot -p123456 -h 10.0.0.53 -P 9066
mysql> show @@datasource;
+----------+--------+-------+-----------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME   | TYPE  | HOST      | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+-----------+------+------+--------+------+------+---------+-----------+------------+
| dn1      | hostM1 | mysql | 10.0.0.51 | 3306 | W    |      0 |   10 | 1000 |     222 |         0 |          6 |
| dn1      | hostS2 | mysql | 10.0.0.52 | 3306 | W    |      0 |    1 | 1000 |     217 |        14 |          0 |
| dn1      | hostS1 | mysql | 10.0.0.52 | 3306 | R    |      0 |   10 | 1000 |     232 |        20 |          0 |
| dn2      | hostM1 | mysql | 10.0.0.51 | 3306 | W    |      0 |   10 | 1000 |     222 |         0 |          6 |
| dn2      | hostS2 | mysql | 10.0.0.52 | 3306 | W    |      0 |    1 | 1000 |     217 |        14 |          0 |
| dn2      | hostS1 | mysql | 10.0.0.52 | 3306 | R    |      0 |   10 | 1000 |     232 |        20 |          0 |
+----------+--------+-------+-----------+------+------+--------+------+------+---------+-----------+------------+
在主節點不掛的狀況下用戶不會寫入到hostS2

2.4 測試高可用

2.4.1 關閉主庫測試

[root@db01 ~]# /etc/init.d/mysqld stop
[root@db01 ~]# mysql -uroot -p123456 -h 10.0.0.53 8066
mysql> use DB2
mysql> create table tb2 (id INT, name VARCHAR(20));
mysql> insert into tb2 values (1, 'aaa'), (2, 'bbb');
mysql> insert into tb2 values (3, 'ccc'), (4, 'ddd');
mysql> insert into tb2 values (5, 'eee'), (6, 'fff');
mysql> select * from tb2;  #(也是多查看幾回)
+------+------+
| id   | name |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
|    4 | ddd  |
|    5 | eee  |
|    6 | fff  |
+------+------+
6 rows in set (0.00 sec)
mysql> show @@datasource;
+----------+--------+-------+-----------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME   | TYPE  | HOST      | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+-----------+------+------+--------+------+------+---------+-----------+------------+
| dn1      | hostM1 | mysql | 10.0.0.51 | 3306 | W    |      0 |    0 | 1000 |       0 |         0 |          6 |
| dn1      | hostS2 | mysql | 10.0.0.52 | 3306 | W    |      0 |    6 | 1000 |     364 |        44 |          4 |
| dn1      | hostS1 | mysql | 10.0.0.52 | 3306 | R    |      0 |   10 | 1000 |     330 |        20 |          0 |
| dn2      | hostM1 | mysql | 10.0.0.51 | 3306 | W    |      0 |    0 | 1000 |       0 |         0 |          6 |
| dn2      | hostS2 | mysql | 10.0.0.52 | 3306 | W    |      0 |    6 | 1000 |     364 |        44 |          4 |
| dn2      | hostS1 | mysql | 10.0.0.52 | 3306 | R    |      0 |   10 | 1000 |     330 |        20 |          0 |
+----------+--------+-------+-----------+------+------+--------+------+------+---------+-----------+------------+
6 rows in set (0.00 sec)
#能夠清楚的看見hostM1已經不寫入了。hostM2既讀數據又寫數據

2.4.2 再去DB1邏輯庫測試

mysql> use DB1
mysql> insert into tb1 values (9, 'abc'), (10, 'cba');
mysql> insert into tb1 values (11, 'abc'), (12, 'cba');
mysql> insert into tb1 values (13, 'abc'), (14, 'cba');
mysql> show @@datasource;
+----------+--------+-------+-----------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME   | TYPE  | HOST      | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+-----------+------+------+--------+------+------+---------+-----------+------------+
| dn1      | hostM1 | mysql | 10.0.0.51 | 3306 | W    |      0 |    0 | 1000 |       0 |         0 |          6 |
| dn1      | hostS2 | mysql | 10.0.0.52 | 3306 | W    |      0 |    6 | 1000 |     410 |        63 |          8 |
| dn1      | hostS1 | mysql | 10.0.0.52 | 3306 | R    |      0 |   10 | 1000 |     353 |        20 |          0 |
| dn2      | hostM1 | mysql | 10.0.0.51 | 3306 | W    |      0 |    0 | 1000 |       0 |         0 |          6 |
| dn2      | hostS2 | mysql | 10.0.0.52 | 3306 | W    |      0 |    6 | 1000 |     410 |        63 |          8 |
| dn2      | hostS1 | mysql | 10.0.0.52 | 3306 | R    |      0 |   10 | 1000 |     353 |        20 |          0 |
+----------+--------+-------+-----------+------+------+--------+------+------+---------+-----------+------------+
#再次查看也不會往數據庫hostM1上寫入,這時候db1和db2的數據是不一致的。

2.4.3  啓動數據庫db1,進入查看數據  

[root@db01 ~]# /etc/init.d/mysqld start
Starting MySQL.... SUCCESS! 
[root@db01 ~]# mysql
mysql> show databases;
mysql> use db1
mysql> select * from tb1;
+------+------+
| id   | name |
+------+------+
|    1 | guli |
|    2 | xie  |
|    3 | ccc  |
|    4 | ddd  |
|    5 | eee  |
|    6 | fff  |
|    7 | ggg  |
|    8 | hhh  |
+------+------+
8 rows in set (0.01 sec)
mysql> use db2
mysql> show tables;
Empty set (0.00 sec)

2.4.4  數據庫db2,進入查看數據  

[root@db02 ~]# mysql
mysql> show databases;
mysql> use db1
mysql> show tables;
mysql> select * from tb1;
+------+------+
| id   | name |
+------+------+
|    1 | guli |
|    2 | xie  |
|    3 | ccc  |
|    4 | ddd  |
|    5 | eee  |
|    6 | fff  |
|    7 | ggg  |
|    8 | hhh  |
|    9 | abc  |
|   10 | cba  |
|   11 | abc  |
|   12 | cba  |
|   13 | abc  |
|   14 | cba  |
+------+------+
mysql> use db2
mysql> show tables;
mysql> select * from tb2;
+------+------+
| id   | name |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
|    4 | ddd  |
|    5 | eee  |
|    6 | fff  |
+------+------+

總結:

  • 到此基本演示了 mycat 的主從讀寫分離功能,配置的前提是已經有一個配置好的 mysql 主從複製架構,mycat 工做於 mysql 主從架構的前端,負責 SQL 語句的分發。
  • 即便在啓動db1,寫入數據也只會往db2上寫入,mycat更牛的地方可能實在分庫分表而不是高可用,我的認爲更適合Percona-XtraDB-Cluster(由於強一致性)

MySQL 優化操做

# 如下選項會被MySQL客戶端應用讀取。  
# 注意只有MySQL附帶的客戶端應用程序保證能夠讀取這段內容。  
# 若是你想你本身的MySQL應用程序獲取這些值。  
# 須要在MySQL客戶端庫初始化的時候指定這些選項。  
   
#  
[client]  
#password = [your_password]  
port = @MYSQL_TCP_PORT@  
socket = @MYSQL_UNIX_ADDR@  
   
# *** 應用定製選項 ***  
   
#  
# MySQL 服務端  
#  
[mysqld]  
   
# 通常配置選項  
port = @MYSQL_TCP_PORT@  
socket = @MYSQL_UNIX_ADDR@  
   
# back_log 是操做系統在監聽隊列中所能保持的鏈接數,  
# 隊列保存了在 MySQL 鏈接管理器線程處理以前的鏈接.  
# 若是你有很是高的鏈接率而且出現 「connection refused」 報錯,  
# 你就應該增長此處的值.  
# 檢查你的操做系統文檔來獲取這個變量的最大值.  
# 若是將back_log設定到比你操做系統限制更高的值,將會沒有效果  
back_log = 300  
   
# 不在 TCP/IP 端口上進行監聽.  
# 若是全部的進程都是在同一臺服務器鏈接到本地的 mysqld,  
# 這樣設置將是加強安全的方法  
# 全部 mysqld 的鏈接都是經過 Unix Sockets 或者命名管道進行的.  
# 注意在 Windows下若是沒有打開命名管道選項而只是用此項  
# (經過 「enable-named-pipe」 選項) 將會致使 MySQL 服務沒有任何做用!  
#skip-networking  
   
# MySQL 服務所容許的同時會話數的上限  
# 其中一個鏈接將被 SUPER 權限保留做爲管理員登陸.  
# 即使已經達到了鏈接數的上限.  
max_connections = 3000  
   
# 每一個客戶端鏈接最大的錯誤容許數量,若是達到了此限制.  
# 這個客戶端將會被 MySQL 服務阻止直到執行了 「FLUSH HOSTS」 或者服務重啓  
# 非法的密碼以及其餘在連接時的錯誤會增長此值.  
# 查看 「Aborted_connects」 狀態來獲取全局計數器.  
max_connect_errors = 50  
   
# 全部線程所打開表的數量.  
# 增長此值就增長了 mysqld 所須要的文件描述符的數量  
# 這樣你須要確認在 [mysqld_safe] 中 「open-files-limit」 變量設置打開文件數量容許至少等於 table_cache 的值  
table_open_cache = 4096  
   
# 容許外部文件級別的鎖. 打開文件鎖會對性能形成負面影響  
# 因此只有在你在一樣的文件上運行多個數據庫實例時才使用此選項(注意仍會有其餘約束!)  
# 或者你在文件層面上使用了其餘一些軟件依賴來鎖定 MyISAM 表  
#external-locking  
   
# 服務所能處理的請求包的最大大小以及服務所能處理的最大的請求大小(當與大的 BLOB 字段一塊兒工做時至關必要)  
# 每一個鏈接獨立的大小,大小動態增長  
max_allowed_packet = 32M  
   
# 在一個事務中 binlog 爲了記錄 SQL 狀態所持有的 cache 大小  
# 若是你常用大的,多聲明的事務,你能夠增長此值來獲取更大的性能.  
# 全部從事務來的狀態都將被緩衝在 binlog 緩衝中而後在提交後一次性寫入到 binlog 中  
# 若是事務比此值大, 會使用磁盤上的臨時文件來替代.  
# 此緩衝在每一個鏈接的事務第一次更新狀態時被建立  
binlog_cache_size = 4M  
   
# 獨立的內存表所容許的最大容量.  
# 此選項爲了防止意外建立一個超大的內存表致使永盡全部的內存資源.  
max_heap_table_size = 128M  
   
# 隨機讀取數據緩衝區使用內存(read_rnd_buffer_size):和順序讀取相對應,  
# 當 MySQL 進行非順序讀取(隨機讀取)數據塊的時候,會利用>這個緩衝區暫存讀取的數據  
# 如根據索引信息讀取表數據,根據排序後的結果集與表進行 Join 等等  
# 總的來講,就是當數據塊的讀取須要知足>必定的順序的狀況下,MySQL 就須要產生隨機讀取,進而使用到 read_rnd_buffer_size 參數所設置的內存緩衝區  
read_rnd_buffer_size = 16M  
   
# 排序緩衝被用來處理相似 ORDER BY 以及 GROUP BY 隊列所引發的排序  
# 若是排序後的數據沒法放入排序緩衝,一個用來替代的基於磁盤的合併分類會被使用  
# 查看 「Sort_merge_passes」 狀態變量.  
# 在排序發生時由每一個線程分配  
sort_buffer_size = 16M  
   
# 此緩衝被使用來優化全聯合(FULL JOINS 不帶索引的聯合).  
# 相似的聯合在極大多數狀況下有很是糟糕的性能表現,可是將此值設大可以減輕性能影響.  
# 經過 「Select_full_join」 狀態變量查看全聯合的數量  
# 當全聯合發生時,在每一個線程中分配  
join_buffer_size = 16M  
   
# 咱們在 cache 中保留多少線程用於重用  
# 當一個客戶端斷開鏈接後,若是 cache 中的線程還少於 thread_cache_size,則客戶端線程被放入cache 中.  
# 這能夠在你須要大量新鏈接的時候極大的減小線程建立的開銷  
# (通常來講若是你有好的線程模型的話,這不會有明顯的性能提高.)  
thread_cache_size = 16  
   
# 此容許應用程序給予線程系統一個提示在同一時間給予渴望被運行的線程的數量.  
# 此值只對於支持 thread_concurrency() 函數的系統有意義( 例如Sun Solaris).  
# 你可能夠嘗試使用 [CPU數量]*(2..4) 來做爲 thread_concurrency 的值  
thread_concurrency = 8  
   
# 查詢緩衝常被用來緩衝 SELECT 的結果而且在下一次一樣查詢的時候再也不執行直接返回結果.  
# 打開查詢緩衝能夠極大的提升服務器速度, 若是你有大量的相同的查詢而且不多修改表.  
# 查看 「Qcache_lowmem_prunes」 狀態變量來檢查是否當前值對於你的負載來講是否足夠高.  
# 注意: 在你表常常變化的狀況下或者若是你的查詢原文每次都不一樣,  
# 查詢緩衝也許引發性能降低而不是性能提高.  
query_cache_size = 128M  
   
# 只有小於此設定值的結果纔會被緩衝  
# 此設置用來保護查詢緩衝,防止一個極大的結果集將其餘全部的查詢結果都覆蓋.  
query_cache_limit = 4M  
   
# 被全文檢索索引的最小的字長.  
# 你也許但願減小它,若是你須要搜索更短字的時候.  
# 注意在你修改此值以後,你須要重建你的 FULLTEXT 索引  
ft_min_word_len = 8  
   
# 若是你的系統支持 memlock() 函數,你也許但願打開此選項用以讓運行中的 mysql 在在內存高度緊張的時候,數據在內存中保持鎖定而且防止可能被 swapping out  
# 此選項對於性能有益  
#memlock  
   
# 當建立新表時做爲默認使用的表類型,  
# 若是在建立表示沒有特別執行表類型,將會使用此值  
default_table_type = InnoDB  
   
# 線程使用的堆大小. 此容量的內存在每次鏈接時被預留.  
# MySQL 自己常不會須要超過 64K 的內存  
# 若是你使用你本身的須要大量堆的 UDF 函數或者你的操做系統對於某些操做須要更多的堆,你也許須要將其設置的更高一點.  
thread_stack = 512K  
   
# 設定默認的事務隔離級別.可用的級別以下:  
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE  
transaction_isolation = REPEATABLE-READ  
   
# 內部(內存中)臨時表的最大大小  
# 若是一個表增加到比此值更大,將會自動轉換爲基於磁盤的表.  
# 此限制是針對單個表的,而不是總和.  
tmp_table_size = 128M  
   
# 打開二進制日誌功能.  
# 在複製(replication)配置中,做爲 MASTER 主服務器必須打開此項  
# 若是你須要從你最後的備份中作基於時間點的恢復,你也一樣須要二進制日誌.  
log-bin=mysql-bin  
   
# 若是你在使用鏈式從服務器結構的複製模式 (A->B->C),  
# 你須要在服務器B上打開此項.  
# 此選項打開在從線程上重作過的更新的日誌, 並將其寫入從服務器的二進制日誌.  
#log_slave_updates  
   
# 打開全查詢日誌. 全部的由服務器接收到的查詢 (甚至對於一個錯誤語法的查詢)  
# 都會被記錄下來. 這對於調試很是有用, 在生產環境中經常關閉此項.  
#general_log=ON  
#general_log_file=/usr/local/mysql/log/mysql.log  
   
# 將警告打印輸出到錯誤 log 文件. 若是你對於 MySQL 有任何問題  
# 你應該打開警告 log 而且仔細審查錯誤日誌,查出可能的緣由.  
#log_warnings  
   
# 記錄慢速查詢. 慢速查詢是指消耗了比 「long_query_time」 定義的更多時間的查詢.  
# 若是 log_long_format 被打開,那些沒有使用索引的查詢也會被記錄.  
# 若是你常常增長新查詢到已有的系統內的話. 通常來講這是一個好主意,  
log_slow_queries  
   
# 全部的使用了比這個時間(以秒爲單位)更多的查詢會被認爲是慢速查詢.  
# 不要在這裏使用「1″, 不然會致使全部的查詢,甚至很是快的查詢頁被記錄下來(因爲 MySQL 目前時間的精確度只能達到秒的級別).  
long_query_time = 6  
   
# 在慢速日誌中記錄更多的信息.  
# 通常此項最好打開.  
# 打開此項會記錄使得那些沒有使用索引的查詢也被做爲到慢速查詢附加到慢速日誌裏  
log_long_format  
   
# 此目錄被MySQL用來保存臨時文件.例如,  
# 它被用來處理基於磁盤的大型排序,和內部排序同樣.  
# 以及簡單的臨時表.  
# 若是你不建立很是大的臨時文件,將其放置到 swapfs/tmpfs 文件系統上也許比較好  
# 另外一種選擇是你也能夠將其放置在獨立的磁盤上.  
# 你可使用」;」來放置多個路徑  
# 他們會按照 roud-robin 方法被輪詢使用.  
#tmpdir = /tmp  
   
# *** 主從複製相關的設置  
   
# 惟一的服務辨識號,數值位於 1 到 2^32-1之間.  
# 此值在master和slave上都須要設置.  
# 若是 「master-host」 沒有被設置,則默認爲1, 可是若是忽略此選項,MySQL不會做爲master生效.  
server-id = 1  
   
# 複製的Slave (去掉master段的註釋來使其生效)  
#  
# 爲了配置此主機做爲複製的slave服務器,你能夠選擇兩種方法:  
#  
# 1) 使用 CHANGE MASTER TO 命令 (在咱們的手冊中有完整描述) -  
# 語法以下:  
#  
# CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,  
# MASTER_USER=, MASTER_PASSWORD= ;  
#  
# 你須要替換掉 , , 等被尖括號包圍的字段以及使用master的端口號替換 (默認3306).  
#  
# 例子:  
#  
# CHANGE MASTER TO MASTER_HOST=’125.564.12.1′, MASTER_PORT=3306,  
# MASTER_USER=’joe’, MASTER_PASSWORD=’secret’;  
#  
# 或者  
#  
# 2) 設置如下的變量. 不論如何, 在你選擇這種方法的狀況下, 而後第一次啓動複製(甚至不成功的狀況下,  
# 例如若是你輸入錯密碼在master-password字段而且slave沒法鏈接),  
# slave會建立一個 master.info 文件,而且以後任何對於包含在此文件內的參數的變化都會被忽略  
# 而且由 master.info 文件內的內容覆蓋, 除非你關閉slave服務, 刪除 master.info 而且重啓slave 服務.  
# 因爲這個緣由,你也許不想碰一下的配置(註釋掉的) 而且使用 CHANGE MASTER TO (查看上面) 來代替  
#  
# 所須要的惟一id號位於 2 和 2^32 – 1之間  
# (而且和master不一樣)  
# 若是master-host被設置了.則默認值是2  
# 可是若是省略,則不會生效  
#server-id = 2  
#  
# 複製結構中的master – 必須  
#master-host =  
#  
# 當鏈接到master上時slave所用來認證的用戶名 – 必須  
#master-user =  
#  
# 當鏈接到master上時slave所用來認證的密碼 – 必須  
#master-password =  
#  
# master監聽的端口.  
# 可選 – 默認是3306  
#master-port =  
   
# 使得slave只讀.只有用戶擁有SUPER權限和在上面的slave線程可以修改數據.  
# 你可使用此項去保證沒有應用程序會意外的修改slave而不是master上的數據  
#read_only  
   
#*** MyISAM 相關選項  
   
# 關鍵詞緩衝的大小, 通常用來緩衝 MyISAM 表的索引塊.  
# 不要將其設置大於你可用內存的30%,  
# 由於一部份內存一樣被OS用來緩衝行數據  
# 甚至在你並不使用 MyISAM 表的狀況下, 你也須要仍舊設置起 8-64M 內存因爲它一樣會被內部臨時磁盤表使用.  
key_buffer_size = 128M  
   
# 用來作 MyISAM 表全表掃描的緩衝大小.  
# 當全表掃描須要時,在對應線程中分配.  
read_buffer_size = 8M  
   
# 當在排序以後,從一個已經排序好的序列中讀取行時,行數據將從這個緩衝中讀取來防止磁盤尋道.  
# 若是你增高此值,能夠提升不少 ORDER BY 的性能.  
# 當須要時由每一個線程分配  
read_rnd_buffer_size = 64M  
   
# MyISAM 使用特殊的相似樹的 cache 來使得突發插入  
# (這些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATA INFILE) 更快.  
# 此變量限制每一個進程中緩衝樹的字節數.  
# 設置爲 0 會關閉此優化.  
# 爲了最優化不要將此值設置大於 「key_buffer_size」.  
# 當突發插入被檢測到時此緩衝將被分配.  
bulk_insert_buffer_size = 256M  
   
# 此緩衝當 MySQL 須要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一個空表中引發重建索引時被分配.  
# 這在每一個線程中被分配.因此在設置大值時須要當心.  
myisam_sort_buffer_size = 256M  
   
# MySQL 重建索引時所容許的最大臨時文件的大小 (當 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).  
# 若是文件大小比此值更大,索引會經過鍵值緩衝建立(更慢)  
myisam_max_sort_file_size = 10G  
   
# 若是被用來更快的索引建立索引所使用臨時文件大於制定的值,那就使用鍵值緩衝方法.  
# 這主要用來強制在大表中長字串鍵去使用慢速的鍵值緩衝方法來建立索引.  
myisam_max_extra_sort_file_size = 10G  
   
# 若是一個表擁有超過一個索引, MyISAM 能夠經過並行排序使用超過一個線程去修復他們.  
# 這對於擁有多個 CPU 以及大量內存狀況的用戶,是一個很好的選擇.  
myisam_repair_threads = 1  
   
# 自動檢查和修復沒有適當關閉的 MyISAM 表.  
myisam_recover  
   
# 默認關閉 Federated  
skip-federated  
   
# *** BDB 相關選項 ***  
   
# 若是你運行的MySQL服務有BDB支持可是你不許備使用的時候使用此選項. 這會節省內存而且可能加速一些事.  
skip-bdb  
   
# *** INNODB 相關選項 ***  
   
# 若是你的 MySQL 服務包含 InnoDB 支持可是並不打算使用的話,  
# 使用此選項會節省內存以及磁盤空間,而且加速某些部分  
#skip-innodb  
   
# 附加的內存池被 InnoDB 用來保存 metadata 信息(5.6中再也不推薦使用)  
# 若是 InnoDB 爲此目的須要更多的內存,它會開始從 OS 這裏申請內存.  
# 因爲這個操做在大多數現代操做系統上已經足夠快, 你通常不須要修改此值.  
# SHOW INNODB STATUS 命令會顯示當先使用的數量.  
innodb_additional_mem_pool_size = 64M  
   
# InnoDB使用一個緩衝池來保存索引和原始數據, 不像 MyISAM.  
# 這裏你設置越大,這能保證你在大多數的讀取操做時使用的是內存而不是硬盤,在存取表裏面數據時所須要的磁盤 I/O 越少.  
# 在一個獨立使用的數據庫服務器上,你能夠設置這個變量到服務器物理內存大小的80%  
# 不要設置過大,不然,因爲物理內存的競爭可能致使操做系統的換頁顛簸.  
# 注意在32位系統上你每一個進程可能被限制在 2-3.5G 用戶層面內存限制,  
# 因此不要設置的過高.  
innodb_buffer_pool_size = 6G  
   
# InnoDB 將數據保存在一個或者多個數據文件中成爲表空間.  
# 若是你只有單個邏輯驅動保存你的數據,一個單個的自增文件就足夠好了.  
# 其餘狀況下.每一個設備一個文件通常都是個好的選擇.  
# 你也能夠配置 InnoDB 來使用裸盤分區 – 請參考手冊來獲取更多相關內容  
innodb_data_file_path = ibdata1:10M:autoextend  
   
# 設置此選項若是你但願InnoDB表空間文件被保存在其餘分區.  
# 默認保存在MySQL的datadir中.  
#innodb_data_home_dir =  
   
# 用來同步IO操做的IO線程的數量.  
# 此值在Unix下被硬編碼爲8,可是在Windows磁盤I/O可能在一個大數值下表現的更好.  
innodb_file_io_threads = 8  
   
# 若是你發現 InnoDB 表空間損壞, 設置此值爲一個非零值可能幫助你導出你的表.  
# 從1開始而且增長此值知道你可以成功的導出表.  
#innodb_force_recovery=1  
   
# 在 InnoDb 核心內的容許線程數量.  
# 最優值依賴於應用程序,硬件以及操做系統的調度方式.  
# 太高的值可能致使線程的互斥顛簸.  
innodb_thread_concurrency = 16  
   
# 若是設置爲1 ,InnoDB 會在每次提交後刷新(fsync)事務日誌到磁盤上,  
# 這提供了完整的 ACID 行爲.  
# 若是你願意對事務安全折衷, 而且你正在運行一個小的事物, 你能夠設置此值到0或者2來減小由事務日誌引發的磁盤I/O  
# 0表明日誌只大約每秒寫入日誌文件而且日誌文件刷新到磁盤.  
# 2表明日誌寫入日誌文件在每次提交後,可是日誌文件只有大約每秒纔會刷新到磁盤上.  
innodb_flush_log_at_trx_commit = 2  
(說明:若是是遊戲服務器,建議此值設置爲2;若是是對數據安全要求極高的應用,建議設置爲1;設置爲0性能最高,但若是發生故障,數據可能會有丟失的危險!默認值1的意思是每一次事務提交或事務外的指令都須要把日誌寫入(flush)硬盤,這是很費時的。特別是使用電池供電緩存(Battery backed up cache)時。設成2對於不少運用,特別是從MyISAM錶轉過來的是能夠的,它的意思是不寫入硬盤而是寫入系統緩存。日誌仍然會每秒flush到硬盤,因此你通常不會丟失超過1-2秒的更新。設成0會更快一點,但安全方面比較差,即便MySQL掛了也可能會丟失事務的數據。而值2只會在整個操做系統掛了時纔可能丟數據。)  
   
# 加速 InnoDB 的關閉. 這會阻止 InnoDB 在關閉時作全清除以及插入緩衝合併.  
# 這可能極大增長關機時間, 可是取而代之的是 InnoDB 可能在下次啓動時作這些操做.  
#innodb_fast_shutdown  
   
# 用來緩衝日誌數據的緩衝區的大小.  
# 當此值快滿時, InnoDB 將必須刷新數據到磁盤上.  
# 因爲基本上每秒都會刷新一次,因此沒有必要將此值設置的太大(甚至對於長事務而言)  
innodb_log_buffer_size = 16M  
   
# 在日誌組中每一個日誌文件的大小.  
# 你應該設置日誌文件總合大小到你緩衝池大小的25%~100%  
# 來避免在日誌文件覆寫上沒必要要的緩衝池刷新行爲.  
# 不論如何, 請注意一個大的日誌文件大小會增長恢復進程所須要的時間.  
innodb_log_file_size = 512M  
   
# 在日誌組中的文件總數.  
# 一般來講2~3是比較好的.  
innodb_log_files_in_group = 3  
   
# InnoDB 的日誌文件所在位置. 默認是 MySQL 的 datadir.  
# 你能夠將其指定到一個獨立的硬盤上或者一個RAID1捲上來提升其性能  
#innodb_log_group_home_dir  
   
# 在 InnoDB 緩衝池中最大容許的髒頁面的比例.  
# 若是達到限額, InnoDB 會開始刷新他們防止他們妨礙到乾淨數據頁面.  
# 這是一個軟限制,不被保證絕對執行.  
innodb_max_dirty_pages_pct = 90  
   
# InnoDB 用來刷新日誌的方法.  
# 表空間老是使用雙重寫入刷新方法  
# 默認值是 「fdatasync」, 另外一個是 「O_DSYNC」.  
# 通常來講,若是你有硬件 RAID 控制器,而且其獨立緩存採用 write-back 機制,並有着電池斷電保護,那麼應該設置配置爲 O_DIRECT  
# 不然,大多數狀況下應將其設爲 fdatasync  
#innodb_flush_method=fdatasync  
   
# 在被回滾前,一個 InnoDB 的事務應該等待一個鎖被批准多久.  
# InnoDB 在其擁有的鎖表中自動檢測事務死鎖而且回滾事務.  
# 若是你使用 LOCK TABLES 指令, 或者在一樣事務中使用除了 InnoDB 之外的其餘事務安全的存儲引擎  
# 那麼一個死鎖可能發生而 InnoDB 沒法注意到.  
# 這種狀況下這個 timeout 值對於解決這種問題就很是有幫助.  
innodb_lock_wait_timeout = 120  
   
# 這項設置告知InnoDB是否須要將全部表的數據和索引存放在共享表空間裏(innodb_file_per_table = OFF) 或者爲每張表的數據單獨放在一個.ibd文件(innodb_file_per_table = ON)  
# 每張表一個文件容許你在drop、truncate或者rebuild表時回收磁盤空間  
# 這對於一些高級特性也是有必要的,好比數據壓縮,可是它不會帶來任何性能收益  
innodb_file_per_table = on  
   
[mysqldump]  
# 不要在將內存中的整個結果寫入磁盤以前緩存. 在導出很是巨大的表時須要此項  
quick  
   
max_allowed_packet = 32M  
   
[mysql]  
no-auto-rehash  
   
# 僅僅容許使用鍵值的 UPDATEs 和 DELETEs .  
#safe-updates  
   
[myisamchk]  
key_buffer = 16M  
sort_buffer_size = 16M  
read_buffer = 8M  
write_buffer = 8M  
   
[mysqlhotcopy]  
interactive-timeout  
   
[mysqld_safe]  
# 增長每一個進程的可打開文件數量.  
# 警告: 確認你已經將全系統限制設定的足夠高!  
# 打開大量表須要將此值設大  
open-files-limit = 8192
相關文章
相關標籤/搜索