Кассандра: Удалить работает на локальном, но не на развернутом - PullRequest
0 голосов
/ 11 ноября 2019

Наш сервис может без проблем выполнять запросы SELECT и INSERT на наших локальных и развернутых экземплярах Cassandra.

Однако у нас возникли проблемы со следующим запросом DELETE:

DELETE FROM config_by_uuid WHERE uuid = record_uuid;

Наш сервис может успешно удалить запись в нашем локальном экземпляре, но не в нашем развернутом экземпляре. Обратите внимание, что это поведение является постоянным для обоих экземпляров, и что о наших развернутых экземплярах не сообщается об ошибках.

Примечательно, что когда вышеуказанный запрос выполняется на нашем развернутом экземпляре через cqlsh, он успешно удаляетзапись. Сбой только при запуске из нашего сервиса на нашем развернутом экземпляре. Наш сервис и cqlsh используют одного и того же пользователя для выполнения запросов.

Сначала мы подозревали, что это может быть проблема согласованности Cassandra, поэтому мы попытались запустить запрос на cqlsh с уровнями согласованности ONE и QUORUM, и для обоих уровней согласованности запрос выполнен успешно. Обратите внимание, что наш сервис в настоящее время использует QUORUM для всех операций.

Причина, по которой мы не учитываем возможность возникновения проблемы с кодом, заключается в том, что сервис работает так, как задумано для нашего локального экземпляра. Мы рассуждаем так: если бы это была проблема с кодом, она бы не работала в обоих случаях, и поэтому разница должна лежать где-то в наших установках Cassandra. Оба экземпляра используют Cassandra 3.11.X.

Наше пространство ключей и детали таблицы одинаковы для обоих экземпляров и заключаются в следующем (обратите внимание, что на данный момент мы работаем только с одним узлом, потому что мы все еще на ранних этапахразвития):

CREATE KEYSPACE config WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}  AND durable_writes = true;

CREATE TABLE config.config_by_uuid (
    uuid uuid PRIMARY KEY,
    config_name text,
    config_value text,
    service_uuid uuid,
    tenant_uuid uuid,
    user_uuid uuid
) WITH bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';

Мы включили трассировку на нашей развернутой Cassandra, и ниже приведены подробности при выполнении запроса через cqlsh:

system_traces.sessions:

session_id: 25b48ce0-0491-11ea-ace9-5db0758d00f3
client: node_ip
command: QUERY
coordinator: node_ip
duration: 1875
parameters: {'consistency_level': 'ONE', 'page_size': '100', 'query': 'delete from config_by_uuid where uuid = 96ac4699-5199-4a80-9c59-b592d28ea2b7;', 'serial_consistency_level': 'SERIAL'}
request: Execute CQL3 query
started_at: 2019-11-11 14:40:03.758000+0000

system_traces.events:

  session_id                           | event_id                             | activity                                                                              | source       | source_elapsed | thread
--------------------------------------+--------------------------------------+---------------------------------------------------------------------------------------+--------------+----------------+-----------------------------
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4b3f0-0491-11ea-ace9-5db0758d00f3 | Parsing delete from config_by_uuid where uuid = 96ac4699-5199-4a80-9c59-b592d28ea2b7; | node_ip |            203 | Native-Transport-Requests-1
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4b3f1-0491-11ea-ace9-5db0758d00f3 |                                                                   Preparing statement | node_ip |            381 | Native-Transport-Requests-1
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4b3f2-0491-11ea-ace9-5db0758d00f3 |                                             Executing single-partition query on roles | node_ip |           1044 |                 ReadStage-3
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4b3f3-0491-11ea-ace9-5db0758d00f3 |                                                          Acquiring sstable references | node_ip |           1080 |                 ReadStage-3
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4db00-0491-11ea-ace9-5db0758d00f3 |             Skipped 0/1 non-slice-intersecting sstables, included 0 due to tombstones | node_ip |           1114 |                 ReadStage-3
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4db01-0491-11ea-ace9-5db0758d00f3 |                                                           Key cache hit for sstable 2 | node_ip |           1152 |                 ReadStage-3
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4db02-0491-11ea-ace9-5db0758d00f3 |                                             Merged data from memtables and 1 sstables | node_ip |           1276 |                 ReadStage-3
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4db03-0491-11ea-ace9-5db0758d00f3 |                                                Read 1 live rows and 0 tombstone cells | node_ip |           1307 |                 ReadStage-3
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4db04-0491-11ea-ace9-5db0758d00f3 |                                             Executing single-partition query on roles | node_ip |           1466 |                 ReadStage-3
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4db05-0491-11ea-ace9-5db0758d00f3 |                                                          Acquiring sstable references | node_ip |           1484 |                 ReadStage-3
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4db06-0491-11ea-ace9-5db0758d00f3 |             Skipped 0/1 non-slice-intersecting sstables, included 0 due to tombstones | node_ip |           1501 |                 ReadStage-3
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4db07-0491-11ea-ace9-5db0758d00f3 |                                                           Key cache hit for sstable 2 | node_ip |           1525 |                 ReadStage-3
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4db08-0491-11ea-ace9-5db0758d00f3 |                                             Merged data from memtables and 1 sstables | node_ip |           1573 |                 ReadStage-3
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4db09-0491-11ea-ace9-5db0758d00f3 |                                                Read 1 live rows and 0 tombstone cells | node_ip |           1593 |                 ReadStage-3
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4db0a-0491-11ea-ace9-5db0758d00f3 |                                                     Determining replicas for mutation | node_ip |           1743 | Native-Transport-Requests-1
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4db0b-0491-11ea-ace9-5db0758d00f3 |                                                                Appending to commitlog | node_ip |           1796 |             MutationStage-3
 25b48ce0-0491-11ea-ace9-5db0758d00f3 | 25b4db0c-0491-11ea-ace9-5db0758d00f3 |                                                     Adding to config_by_uuid memtable | node_ip |           1827 |             MutationStage-3

Ниже приведены подробности при выполнении запроса изнаш сервис:

system_traces.sessions:

session_id: 9ed67270-048f-11ea-ace9-5db0758d00f3
client: service_ip
command: QUERY
coordinator: node_ip
duration: 3247
parameters: {'bound_var_0_uuid': '19e12033-5ad4-4376-8293-315a26370d93', 'consistency_level': 'QUORUM', 'page_size': '5000', 'query': 'DELETE FROM config.config_by_uuid WHERE uuid=? ', 'serial_consistency_level': 'SERIAL'}
request: Execute CQL3 prepared query
started_at: 2019-11-11 14:29:07.991000+0000

system_traces.events:

 session_id                           | event_id                             | activity                                                                  | source       | source_elapsed | thread
--------------------------------------+--------------------------------------+---------------------------------------------------------------------------+--------------+----------------+-----------------------------
 9ed67270-048f-11ea-ace9-5db0758d00f3 | 9ed67271-048f-11ea-ace9-5db0758d00f3 |                                 Executing single-partition query on roles | node_ip |            178 |                 ReadStage-2
 9ed67270-048f-11ea-ace9-5db0758d00f3 | 9ed67272-048f-11ea-ace9-5db0758d00f3 |                                              Acquiring sstable references | node_ip |            204 |                 ReadStage-2
 9ed67270-048f-11ea-ace9-5db0758d00f3 | 9ed67273-048f-11ea-ace9-5db0758d00f3 | Skipped 0/1 non-slice-intersecting sstables, included 0 due to tombstones | node_ip |            368 |                 ReadStage-2
 9ed67270-048f-11ea-ace9-5db0758d00f3 | 9ed69980-048f-11ea-ace9-5db0758d00f3 |                                               Key cache hit for sstable 2 | node_ip |            553 |                 ReadStage-2
 9ed67270-048f-11ea-ace9-5db0758d00f3 | 9ed69981-048f-11ea-ace9-5db0758d00f3 |                                 Merged data from memtables and 1 sstables | node_ip |            922 |                 ReadStage-2
 9ed67270-048f-11ea-ace9-5db0758d00f3 | 9ed69982-048f-11ea-ace9-5db0758d00f3 |                                    Read 1 live rows and 0 tombstone cells | node_ip |           1193 |                 ReadStage-2
 9ed67270-048f-11ea-ace9-5db0758d00f3 | 9ed6c090-048f-11ea-ace9-5db0758d00f3 |                                 Executing single-partition query on roles | node_ip |           1587 |                 ReadStage-3
 9ed67270-048f-11ea-ace9-5db0758d00f3 | 9ed6c091-048f-11ea-ace9-5db0758d00f3 |                                              Acquiring sstable references | node_ip |           1642 |                 ReadStage-3
 9ed67270-048f-11ea-ace9-5db0758d00f3 | 9ed6c092-048f-11ea-ace9-5db0758d00f3 | Skipped 0/1 non-slice-intersecting sstables, included 0 due to tombstones | node_ip |           1708 |                 ReadStage-3
 9ed67270-048f-11ea-ace9-5db0758d00f3 | 9ed6c093-048f-11ea-ace9-5db0758d00f3 |                                               Key cache hit for sstable 2 | node_ip |           1750 |                 ReadStage-3
 9ed67270-048f-11ea-ace9-5db0758d00f3 | 9ed6c094-048f-11ea-ace9-5db0758d00f3 |                                 Merged data from memtables and 1 sstables | node_ip |           1845 |                 ReadStage-3
 9ed67270-048f-11ea-ace9-5db0758d00f3 | 9ed6c095-048f-11ea-ace9-5db0758d00f3 |                                    Read 1 live rows and 0 tombstone cells | node_ip |           1888 |                 ReadStage-3
 9ed67270-048f-11ea-ace9-5db0758d00f3 | 9ed6e7a0-048f-11ea-ace9-5db0758d00f3 |                                         Determining replicas for mutation | node_ip |           2660 | Native-Transport-Requests-1
 9ed67270-048f-11ea-ace9-5db0758d00f3 | 9ed6e7a1-048f-11ea-ace9-5db0758d00f3 |                                                    Appending to commitlog | node_ip |           3028 |             MutationStage-2
 9ed67270-048f-11ea-ace9-5db0758d00f3 | 9ed6e7a2-048f-11ea-ace9-5db0758d00f3 |                                         Adding to config_by_uuid memtable | node_ip |           3133 |             MutationStage-2

Ниже приведены шаги, которые мы использовали для установки нашей локальной Cassandra в Windows 10. Обратите внимание, что никакие файлы конфигурации не были изменены после установки:

  1. Установленная Java 8. java -version и javac -version работают.

  2. Установленный Python 2. python --version isрабочий.

  3. Загрузил последний файл Cassandra bin.tar.gz из:

    http://cassandra.apache.org/download/
    
  4. Извлек содержимое zip-файла, переименовал его вcassandra и поместил его в C:\.

  5. Добавлено C:\cassandra\bin в нашу переменную среды PATH.

Ниже приведены шагиМы использовали для установки нашей развернутой Cassandra на CentOS 8:

  1. Обновление ням:

    yum -y update
    
  2. Установка Java:

    yum -y install java
    
    java -version 
    
  3. Создать файл репо, который будет использоваться yum:

    nano /etc/yum.repos.d/cassandra.repo
    
    ---
    
    [cassandra]
    name=Apache Cassandra
    baseurl=https://www.apache.org/dist/cassandra/redhat/311x/
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://www.apache.org/dist/cassandra/KEYS
    
  4. Установить Cassandra:

    yum -y install cassandra
    
  5. Создание файла службы для Cassandra:

    nano /etc/systemd/system/cassandra.service
    
    ---
    
    [Unit]
    Description=Apache Cassandra
    After=network.target
    
    [Service]
    PIDFile=/var/run/cassandra/cassandra.pid
    User=cassandra
    Group=cassandra
    ExecStart=/usr/sbin/cassandra -f -p /var/run/cassandra/cassandra.pid
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    
  6. Перезагрузка системных демонов:

    systemctl daemon-reload
    
  7. Предоставление разрешений для каталога Cassandra:

    sudo chown -R cassandra:cassandra /var/lib/cassandra   
    sudo chown -R cassandra:cassandra /var/log/cassandra
    
  8. Настройка системы для запуска Cassandra при запуске:

    systemctl enable cassandra
    
  9. Настройка файла cassandra.yaml:

    nano /etc/cassandra/conf/cassandra.yaml
    
    ---
    
    (TIP: Use Ctrl+W to search for the settings you want to change.)
    
    authenticator: org.apache.cassandra.auth.PasswordAuthenticator
    
    authorizer: org.apache.cassandra.auth.CassandraAuthorizer
    
    role_manager: CassandraRoleManager
    
    roles_validity_in_ms: 0
    
    permissions_validity_in_ms: 0
    
    cluster_name: 'MyCompany Dev'
    
    initial_token: (should be commented-out)
    
    listen_address: node_ip
    
    rpc_address: node_ip
    
    endpoint_snitch: GossipingPropertyFileSnitch
    
    auto_bootstrap: false (add this at the bottom of the file)
    
    seed_provider:
      - class_name: org.apache.cassandra.locator.SimpleSeedProvider
        parameters:
             - seeds: "node_ip"
    
  10. Настройка файла cassandra-topology.properties:

    nano /etc/cassandra/conf/cassandra-topology.properties
    
    ---    
    
    (NOTE: For "Cassandra Node IP=Data Center:Rack", delete all existing values.)
    
    #Cassandra Node IP=Data Center:Rack
    [Local IP]=SG:Dev
    
    # default for unknown nodes
    default=SG:Dev
    
  11. Настройте файл cassandra-rackdc.properties:

    nano /etc/cassandra/conf/cassandra-rackdc.properties
    
    ---
    
    dc=SG
    
    rack=Dev    
    
  12. Выполните следующие команды для очистки каталогов:

    rm -rf /var/lib/cassandra/data
    rm -rf /var/lib/cassandra/commitlog
    rm -rf /var/lib/cassandra/saved_caches
    rm -rf /var/lib/cassandra/hints
    
  13. Запустить Cassandra:

    service cassandra start
    
  14. Установить Python 2:

    yum -y install python2
    
    python2 --version
    
  15. Войдите в систему по умолчаниюпользователь:

    cqlsh -u cassandra -p cassandra node_ip --request-timeout=6000
    
  16. Создать нового пользователя:

    CREATE ROLE adminuser WITH PASSWORD = 'password' AND SUPERUSER = true AND LOGIN = true;
    exit;
    
  17. Войти как новый пользователь:

    cqlsh -u adminuser -p password node_ip --request-timeout=6000
    
  18. Отключить пользователя по умолчанию:

    ALTER ROLE cassandra WITH PASSWORD = 'cassandra' AND SUPERUSER = false AND LOGIN = false;
    REVOKE ALL PERMISSIONS ON ALL KEYSPACES FROM cassandra;
    GRANT ALL PERMISSIONS ON ALL KEYSPACES TO adminuser;
    exit;
    

Наш сервис написан на Голанге и использует следующие сторонние библиотеки для общения с Кассандрой:

github.com/gocql/gocql
github.com/scylladb/gocqlx
github.com/scylladb/gocqlx/qb

ОБНОВЛЕНИЕ 1: Ниже приведены разрешения для пользователя, который использует наш сервис и cqlsh для выполнения запросов (через list all permissions on config.config_by_uuid;):

  role     |  username | resource                      | permission
 ----------+-----------+-------------------------------+------------
 adminuser | adminuser |               <all keyspaces> |     CREATE
 adminuser | adminuser |               <all keyspaces> |      ALTER
 adminuser | adminuser |               <all keyspaces> |       DROP
 adminuser | adminuser |               <all keyspaces> |     SELECT
 adminuser | adminuser |               <all keyspaces> |     MODIFY
 adminuser | adminuser |               <all keyspaces> |  AUTHORIZE
 adminuser | adminuser |             <keyspace config> |     CREATE
 adminuser | adminuser |             <keyspace config> |      ALTER
 adminuser | adminuser |             <keyspace config> |       DROP
 adminuser | adminuser |             <keyspace config> |     SELECT
 adminuser | adminuser |             <keyspace config> |     MODIFY
 adminuser | adminuser |             <keyspace config> |  AUTHORIZE
 adminuser | adminuser | <table config.config_by_uuid> |      ALTER
 adminuser | adminuser | <table config.config_by_uuid> |       DROP
 adminuser | adminuser | <table config.config_by_uuid> |     SELECT
 adminuser | adminuser | <table config.config_by_uuid> |     MODIFY
 adminuser | adminuser | <table config.config_by_uuid> |  AUTHORIZE

Документация Cassandra гласит, что MODIFY предоставляет следующие разрешения: INSERT, DELETE, UPDATE, TRUNCATE. Поскольку adminuser может вставлять записи без каких-либо проблем, похоже, что наша проблема удаления не является проблемой разрешения.

ОБНОВЛЕНИЕ 2: Ниже указаны владелец и разрешениядля ключевых каталогов Cassandra (через ls -al):

/ etc / cassandra:

total 20
drwxr-xr-x    3 root root  4096 Nov 12 22:18 .
drwxr-xr-x. 103 root root 12288 Nov 12 22:18 ..
lrwxrwxrwx    1 root root    27 Nov 12 22:18 conf -> /etc/alternatives/cassandra
drwxr-xr-x    3 root root  4096 Nov 12 22:18 default.conf

/var / lib / cassandra:

total 24
drwxr-xr-x   6 cassandra cassandra 4096 Nov 12 22:38 .
drwxr-xr-x. 43 root      root      4096 Nov 12 22:18 ..
drwxr-xr-x   2 cassandra cassandra 4096 Nov 12 22:38 commitlog
drwxr-xr-x   8 cassandra cassandra 4096 Nov 12 22:40 data
drwxr-xr-x   2 cassandra cassandra 4096 Nov 12 22:38 hints
drwxr-xr-x   2 cassandra cassandra 4096 Nov 12 22:38 saved_caches

/ var / log / cassandra:

total 3788
drwxr-xr-x   2 cassandra cassandra    4096 Nov 12 22:19 .
drwxr-xr-x. 11 root      root         4096 Nov 12 22:18 ..
-rw-r--r--   1 cassandra cassandra 2661056 Nov 12 22:41 debug.log
-rw-r--r--   1 cassandra cassandra   52623 Nov 12 23:11 gc.log.0.current
-rw-r--r--   1 cassandra cassandra 1141764 Nov 12 22:40 system.log

ОБНОВЛЕНИЕ 3: Мы также подозревали, что это проблема tombstone или compaction, поэтому мы попытались установить gc_grace_seconds в 0 и запустили запрос на удаление, но это не помогло. Также не помогает.

Запуск nodetool compact -s config config_by_uuid с gc_grace_seconds, установленным на 0, и значение по умолчанию 864000 также не помогло.

ОБНОВЛЕНИЕ4: Мы попытались удалить и переустановить Cassandra, но это не помогло. Ниже приведены шаги, которые мы использовали:

  1. Удалите Cassandra через yum:

    yum -y remove cassandra
    
  2. Удалите следующие каталоги:

    rm -rf /var/lib/cassandra
    rm -rf /var/log/cassandra
    rm -rf /etc/cassandra    
    
  3. Удалены все оставшиеся файлы:

    (Примечание: выполните rm -rf для результатов следующих команд.)

    find / -name 'cassandra'
    find / -name '*cassandra*'
    

    например,

    rm -rf /run/lock/subsys/cassandra                       
    rm -rf /tmp/hsperfdata_cassandra
    rm -rf /etc/rc.d/rc3.d/S80cassandra
    rm -rf /etc/rc.d/rc2.d/S80cassandra
    rm -rf /etc/rc.d/rc0.d/K20cassandra
    rm -rf /etc/rc.d/rc6.d/K20cassandra
    rm -rf /etc/rc.d/rc5.d/S80cassandra
    rm -rf /etc/rc.d/rc4.d/S80cassandra
    rm -rf /etc/rc.d/rc1.d/K20cassandra
    rm -rf /root/.cassandra
    rm -rf /var/cache/dnf/cassandra-e96532ac33a46b7e
    rm -rf /var/cache/dnf/cassandra.solv
    rm -rf /var/cache/dnf/cassandra-filenames.solvx
    rm -rf /run/systemd/generator.late/graphical.target.wants/cassandra.service
    rm -rf /run/systemd/generator.late/multi-user.target.wants/cassandra.service
    rm -rf /run/systemd/generator.late/cassandra.service   
    

ОБНОВЛЕНИЕ 5: Эта проблема возникала при нашей Server установке CentOS, поэтому мы попытались Minimal Install затем. Удивительно, но проблема не возникла при минимальной установке. В настоящее время мы изучаем, в чем могут быть различия.

ОБНОВЛЕНИЕ 6: Мы попытались создать еще один сервер, на этот раз также выбрав установку Server установки CentOS. Удивительно, но проблема не возникла и на этом сервере, поэтому тип установки CentOS также не имел ничего общего с нашей проблемой.

Этим мы подтвердили, что виновата была наша установка Cassandra, хотя мы еще не уверены, что сделали так неправильно, что даже удаление и переустановка не смогли решить проблему на исходном сервере.

Возможно, наши действия по удалению, описанные выше, не были достаточно тщательными?

ОБНОВЛЕНИЕ 7: Оказывается, причина, по которой у новых серверов не было проблемы, заключается в том, что исходный сервер использовал настраиваемый ISO CentOS вместо ванильного. Один из членов нашей команды изучает, что отличает пользовательский ISO, и я буду обновлять этот вопрос, когда они обратятся к нам.

Большое спасибо всем, кто помог и нашел время, чтобы прочитать этот длинный вопрос, такдалеко!

1 Ответ

1 голос
/ 11 ноября 2019

Это может быть разрешение проблема. Проверьте результат следующей команды:

cqlsh> list all permissions on config.config_by_uuid;

Этот блог от Datastax содержит некоторые подробности об аутентификации и авторизации в Cassandra.

...