<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                RocksDB是facebook基于LevelDB實現的,目前為facebook內部大量業務提供服務。經過facebook大量工作,將RocksDB作為MySQL的一個存儲引擎移植到MySQL,稱之為MyRocks。 經過兩年的發展,MyRocks已經比較成熟(RC階段),現已進入了facebook MySQL的主分支了。MyRocks是開源的,參見[git](https://github.com/facebook/MySQL-5.6)?。 下面對MyRocks做一個簡單介紹,不涉及源碼。 ## RocksDB與innodb的比較 * innodb空間浪費, B tree分裂導致page內有較多空閑,page利用率不高。innodb現有的壓縮效率也不高,壓縮以block為單位,也會造成浪費。 * 寫入放大:innodb 更新以頁為單位,最壞的情況更新N行會更新N個頁。RocksDB append only方式 另外,innodb開啟double write也會增加寫入。 * RocksDB對齊開銷小:SST file (默認2MB)需要對齊,但遠大于4k, RocksDB_block_size(默認4k) 不需要對齊,因此對齊浪費空間較少 * RocksDB索引前綴相同值壓縮存儲,節省空間 * RocksDB占總數據量90%的最底層數據,行內不需要存儲系統列seqid (innodb聚簇索引列包含trxid,roll_ptr等信息) 來看看facebook的測試數據 * 數據空間對比 ![screenshot](http://img4.tbcdn.cn/L1/461/1/8c5ab67bf3d062668c41ef6b61b211e1db5e7166) * QPS ![screenshot](http://img3.tbcdn.cn/L1/461/1/bcc894baeec3236a474aa5be4afc2c1a57266c91) * 寫入放大對比 ![screenshot](http://img4.tbcdn.cn/L1/461/1/4ec40d4a6ef27c3eb46b206e864e2e94b5b34bde) ## 數據字典 數據字段信息保存在System Column Family (System CF) “system“中 數據字段信息包括: * 表信息,表名和index id的映射 * 索引信息,索引元數據信息和column family id。column family和index的對應關系 1:N * column family,一些標記,比如reverse屬性等 * binlog信息 * 統計信息,每個SST file都自帶統計信息(行數、實際大小等),在flush或compaction時更新統計信息,同時統計信息會匯總到數據字典統計信息表中。 以上信息可以通過information_schema查看,如RocksDB_ddl,RocksDB_index_file_map等 ## 記錄格式 RocksDB的行以key value的形式存儲,和innodb類似,記錄格式主鍵和二級索引也有區別 ![screenshot](http://img3.tbcdn.cn/L1/461/1/d0069515c04809a449eda659386afbe966e0d1df) ## 事務與鎖 MyRocks也是基于行鎖,鎖信息都保存在內存中。 MyRocks也支持MVCC,MVCC通過快照的方式實現,類似于PostgreSQL。 MyRocks目前只支持兩種隔離級別,RC和RR。 RR表現和innodb并不一樣,RocksDB 的快照不是在事務開始的時候建立,而是延遲到第一次讀的時候建立. 以下client1 MyRocks返回的是2,innodb返回1 ~~~ <client 1> <client 2> CREATE TABLE t1(pk INT PRIMARY KEY); INSERT INTO t1 VALUES(1); SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN INSERT INTO t1 VALUES(2); SELECT COUNT(*) FROM t1; // MyRocks返回的是2,innodb返回1 ~~~ RC表現也不一樣,事務1大更新多行過程中,其他事務也可以更新事務還未更新到的行,事務1再更新時會失敗。 ## 復制 MyRocks也是通過binlog方式復制,由于binlog與RocksDB之間沒有xa,異常crash可能丟數據,所以,MyRocks主備環境建議開啟semi-sync. 由于gap lock支持不健全(僅primary key上支持), 使用statement方式復制會導致不一致,所有MyRocks建議使用行級復制。 ## 備份恢復 支持MySQLdumup邏輯備份 ~~~ #內部會執行以下語句 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; START TRANSACTION WITH CONSISTENT RocksDB SNAPSHOT; ~~~ 同時有自動的物理備份工具MyRocks_hotbackup,但還不支持備份innodb; 也不支持增量備份。MyRocks_hotbackup支持流式備份 ~~~ MyRocks_hotbackup--user=root --port=3306 --checkpoint_dir=/data/backup --stream=xbstream| ssh$dst‘xbstream–x /data/backup’ #內部建立硬鏈接方式備份數據SST files,checkpoint多次更新,只備份新的SST files, 因此WAL日志很少,恢復時apply log時間很短 SET GLOBAL RocksDB_create_checkpoint= /path/to/backup ~~~ ## 一些優化 * bloom filter bloom filter一般適用于等值查詢 bloom filter信息存儲在SST files中,大概占用2~3%的空間 如果大量查詢返回空集建議開啟bloom filter,如果結果每次都在最底層找到,可以設置optimize_filters_for_hits=true關閉bloom filter以節省空間。 * 數據加載 數據加載時可以忽略唯一性約束檢查,分段自動提交,停寫wal等。 以下是推薦的數據加載時的參數配置 ~~~ rocksdb_skip_unique_check=1 rocksdb_commit_in_the_middle=1 rocksdb_write_disable_wal=1 rocksdb_max_background_flushes=40 rocksdb_max_background_compactions=40 rocksdb_default_cf_options=(in addition to existing parameters); write_buffer_size=128m;level0_file_num_compaction_trigger=4;level0_slowdown_writes_trigger=256;level0_stop_writes_trigger=256;max_write_buffer_number=16;memtable=vector:1024 rocksdb_override_cf_options=(in addition to existing parameters);__system__={memtable=skip_list:16} ~~~ * Reverse column families MyRocks擅長正向掃描,為了提高逆向掃描(ORDER BY DESC)的性能,MyRocks支持了Reverse column families。 在建表可以指定column family的reverse屬性。 * singleDelete 如果key不會重復put, delete操作可以直接刪除put,而不是標記刪除。singleDelete可以提供查詢效率。 ## 一些限制 MyRocks目前有以下一些限制 * 不支持分區表,Online ddl,外鍵,全文索引,空間索引,表空間transport * gap lock支持不健全(僅primary key上支持), 使用statement方式復制會導致不一致 * 不支持select … in share mode * 大小寫敏感,不支持*_bin collation * binlog與RocksDB之間沒有xa,異常crash可能丟數據。所以,MyRocks一般開啟semi-sync. * 不支持savepoint * order by 不比較慢 * 不支持MRR * 暫不支持O_DIRECT * innodb和RocksDB混合使用還不穩定
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看